例如,我有这个案例类:
case class Student (firstName : String, lastName : String)
如果我使用这个案例类,是否有可能向案例类中的字段提供数据是可选的?例如,我会这样做:
val student = new Student(firstName = "Foo")
谢谢!
例如,我有这个案例类:
case class Student (firstName : String, lastName : String)
如果我使用这个案例类,是否有可能向案例类中的字段提供数据是可选的?例如,我会这样做:
val student = new Student(firstName = "Foo")
谢谢!
你很接近:
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)
如果您只是想错过没有默认信息的第二个参数,我建议您使用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")
我会看到通常这样做的两种方式。
case class Student (firstName : String, lastName : String = "")
Student("jeypijeypi") # Student(jeypijeypi,)
case class Student (firstName : String, lastName : String)
object Student {
def apply(firstName: String) = new Student(firstName,"")
}
Student("jeypijeypi") # Student(jeypijeypi,)
哪个更好取决于具体情况。后者为您提供更多自由:您可以将任何参数设为可选,甚至更改它们的顺序(不推荐)。我认为默认参数必须始终位于参数列表的末尾。您也可以将这两种方式结合起来。
注意:在替代构造函数中,您需要new
将编译器指向实际的构造函数。通常new
不与案例类一起使用。