29

たとえば、次のケース クラスがあります。

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

このケース クラスを使用する場合、ケース クラス内のフィールドへのデータの提供はオプションである可能性はありますか? たとえば、次のようにします。

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

ありがとう!

4

3 に答える 3

35

あなたは近かった:

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)
于 2012-08-16T07:29:32.330 に答える
35

デフォルト情報なしで 2 番目のパラメーターを見逃したいだけの場合は、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")
于 2012-08-16T07:46:49.417 に答える