可选字段例如,我有这样的情况下类:case类与斯卡拉
case class Student (firstName : String, lastName : String)
如果我用这个案例类,是有可能,到时类中的字段提供数据是可选的?例如,我会这样做:
val student = new Student(firstName = "Foo")
谢谢!
可选字段例如,我有这样的情况下类:case类与斯卡拉
case class Student (firstName : String, lastName : String)
如果我用这个案例类,是有可能,到时类中的字段提供数据是可选的?例如,我会这样做:
val student = new Student(firstName = "Foo")
谢谢!
如果你只是想错过没有默认信息的第二个参数,我建议你使用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")
谢谢!我更喜欢这个代码。它运作良好。 :D – jeypijeypi 2012-08-16 08:10:20
Noooooooo!不要在代码中使用隐式转换,尤其是不要在String和Option等常见类型之间使用隐式转换。如果这必须“更容易”,请为学生的申请方法添加一个重载。 – 2012-08-16 11:41:42
你接近:
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)
谢谢您的建议。 :D – jeypijeypi 2012-08-16 08:09:58
我会看到通常这样做的两种方式。
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
不适用于案例分类。
对于案例类,您不需要使用“新”。通常被排除在外。 – akauppi 2015-11-11 14:52:51