Допустим, у меня 2 файла.

  • myMainApplication.scala
  • printInfos.scala

Вкратце myMainApplication.scala содержит

val name = "blah"
val age= 45

Вкратце, мой класс myMainApplication.scala должен распечатать имя и возраст, создав новый экземпляр printInfos. Однако мне не следует добавлять никаких параметров при создании экземпляра.

Чего бы я хотел ИЗБЕЖАТЬ:

Внутри printInfos.scala

    class printInfos(val myName: String, 
                     val myAge: Int
                     val myLoc: String
                     val myNPP: Double
                     val myCountry: String
                     val myProvice: String
                     val myNPAP: String) {

    def printInfos() = {
        println("Your method printInfos print out" + myName + myAge + myLoc + myNPP + myCountry + myProvice + myNPAP)
    }

}

Внутри myMainApplication.scala

val name = "blah"
val age= 45
val loc = "blah"
val npp = 45.5
val country = "germany"
val province = "bayern"
val npap = "blaha"
// want to avoid to enter so many params
val printInfoInstance = new printInfos(name, age, loc, npp, country, province, npap)
printInfoInstance.printInfos()

Хочу получить нечто подобное:

Внутри printInfos.scala

    class printInfos() {

       var myName: String  = 0
       var myAge: Int  = 0
       var myLoc: String  = 0
       var myNPP: Double  = 0
       var myCountry: String  = 0
       var myProvice: String  = 0
       var myNPAP: String  = 0

    def printInfos() = {
        println("Your method printInfos print out" + myName + myAge + myLoc + myNPP + myCountry + myProvice + myNPAP)
    }

}

Внутри myMainApplication.scala

// want to create new instance with no params at begining
val printInfoInstance = new printInfos()

val name = "blah"
printInfoInstance.myName() = name
val age= 45
printInfoInstance.myAge() = age
val loc = "blah"
printInfoInstance.myLoc() = loc
val npp = 45.5
printInfoInstance.myNPP() = npp
val country = "germany"
printInfoInstance.myCountry() = country
val province = "bayern"
printInfoInstance.myProvice() = province
val npap = "blaha"
printInfoInstance.myNPAP() = npap

printInfoInstance.printInfos

Нужны улучшения

Можно ли получить что-то похожее на второе предложение, но избегая использования var ? Однако конечная цель по-прежнему заключается в том, чтобы избежать добавления большого количества параметров при создании нового интэнса.

0
S12000 25 Ноя 2016 в 21:23

3 ответа

Лучший ответ

Я предлагаю вам использовать для этого классы scala. Он предоставляет метод копирования, который позволяет вам создать новый экземпляр с измененными параметрами. Это сохраняет все неизменным. Обратите внимание, что вам не нужно обновлять все параметры - вы можете делать это по одному.

case class printInfos(myName: String = "",
                      myAge: Int = 0,
                      myLoc: String = "",
                      myNPP: Double = 0,
                      myCountry: String = "",
                      myProvince: String = "",
                      myNPAP: String = "") {
  def printInfos() = {
    println("Your method printInfos print out" + myName + myAge + myLoc + myNPP + myCountry + myProvince + myNPAP)
  }
}

val printInfoInstance = new printInfos()

val name = "blah"
val age= 45
val loc = "blah"
val npp = 45.5
val country = "germany"
val province = "bayern"
val npap = "blaha"

val newInstance = printInfoInstance.copy(
  myName = name,
  myAge = age,
  myLoc = loc,
  myNPP = npp,
  myCountry = country,
  myProvince = province,
  myNPAP = npap
)

newInstance.printInfos()
3
longshorej 25 Ноя 2016 в 18:33

В дополнение к тому, что упомянул @longshorej, при условии, что у вас определен класс case. вы можете создать экземпляр без ключевого слова new: printInfos("name","age","loc","npp","country","province","npap") создаст новый экземпляр.

Что касается печатной части, я бы предложил переопределить toString, чтобы он хорошо согласовывался со стандартной номенклатурой.

1
phantomastray 25 Ноя 2016 в 21:00

преимуществом системы типов является возможность требовать всех параметров, необходимых для создания действительного экземпляра класса.

Если вы хотите избежать многословной передачи всех параметров каждый раз, вы можете указать для них значения по умолчанию (только хорошая идея, если они действительно необязательны, поскольку вы действительно хотите избежать недопустимых промежуточных состояний).

// assuming it doesn't make sense to instantiate without 
// a few required parameters
case class InfoPrinter (
  name: String,             // required 
  age: Int,                 // required
  loc: String = "",
  NPP: Double = 0,
  country: String = "",
  province: String = "",
  NPAP: String = ""
) {
  def printInfos = 
    println(s"Your method printInfos print out $name $age $loc $NPP $country $province $NPAP")

}

Затем вы можете использовать его так:

// named params or positionally
InfoPrinter("blah", 45, country="germany", province="bayern").printInfos

Любые параметры со значениями по умолчанию можно не указывать.

1
Alvaro Carrasco 25 Ноя 2016 в 21:59