可選字段例如,我有這樣的情況下類: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