Классы классов с необязательными полями в Scala
Например, у меня есть класс case:
case class Student (firstName : String, lastName : String)
Если я использую этот класс case, возможно ли, что передача данных в поля внутри класса case является необязательной? Например, я сделаю это:
val student = new Student(firstName = "Foo")
Спасибо!
Ответы
Ответ 1
Если вы просто хотите пропустить второй параметр без информации по умолчанию, я предлагаю вам использовать Option
.
case class Student(firstName: String, lastName: Option[String] = None)
Теперь вы можете создавать экземпляры таким образом:
Student("Foo")
Student("Foo", None) // equal to the one above
Student("Foo", Some("Bar")) // neccesary to add a lastName
Чтобы сделать его полезным, как вы хотели, я добавлю неявное:
object Student {
implicit def string2Option(s: String) = Some(s)
}
Теперь вы можете называть его такими способами:
import Student._
Student("Foo")
Student("Foo", None)
Student("Foo", Some("Bar"))
Student("Foo", "Bar")
Ответ 2
Вы были близки:
case class Student (firstName : String = "John", lastName : String = "Doe")
val student = Student(firstName = "Foo")
Другая возможность - частично применяемая функция:
case class Student (firstName : String, lastName : String)
val someJohn = Student("John", _: String)
//someJohn: String => Student = <function1>
val johnDoe = someJohn("Doe")
//johnDoe: Student = Student(John,Doe)
И чтобы быть полным, вы можете создать какой-то объект по умолчанию и затем изменить какое-то поле:
val johnDeere = johnDoe.copy(lastName="Deere")
//johnDeer: Student = Student(John,Deere)
Ответ 3
Я бы увидел два способа, как это обычно делается.
1. параметры по умолчанию
case class Student (firstName : String, lastName : String = "")
Student("jeypijeypi") # Student(jeypijeypi,)
2. альтернативные конструкторы
case class Student (firstName : String, lastName : String)
object Student {
def apply(firstName: String) = new Student(firstName,"")
}
Student("jeypijeypi") # Student(jeypijeypi,)
Какой из них лучше всего зависит от обстоятельств. Последнее дает вам больше свободы: вы можете сделать любой параметр опционным или даже изменить свой порядок (не рекомендуется). Я думаю, параметры по умолчанию всегда должны быть в конце списка параметров. Вы также можете комбинировать эти два способа.
Примечание. В альтернативных конструкторах вам нужно new
указать компилятор на фактический конструктор. Обычно new
не используется с классами case.