Подтвердить что ты не робот

Классы классов с необязательными полями в Scala

Например, у меня есть класс case:

case class Student (firstName : String, lastName : String)

Если я использую этот класс case, возможно ли, что передача данных в поля внутри класса case является необязательной? Например, я сделаю это:

val student = new Student(firstName = "Foo")

Спасибо!

4b9b3361

Ответ 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.