scala の val と var 、概念は十分に理解できると思います。
私はこのようなことをしたかった(Javaのような):
trait PersonInfo {
var name: Option[String] = None
var address: Option[String] = None
// plus another 30 var, for example
}
case class Person() extends PersonInfo
object TestObject {
def main(args: Array[String]): Unit = {
val p = new Person()
p.name = Some("someName")
p.address = Some("someAddress")
}
}
名前や住所などを変更できるように...
これは十分に機能しますが、問題は、私のプログラムではすべてが vars になることです。私が理解しているように、scalaではvalが「優先」されています。このタイプの例で、30 個以上の引数のいずれかが変更されるたびにすべての引数を書き直すことなく、val をどのように機能させることができるでしょうか?
つまり、私は持っている可能性があります
trait PersonInfo {
val name: Option[String]
val address: Option[String]
// plus another 30 val, for example
}
case class Person(name: Option[String]=None, address: Option[String]=None, ...plus another 30.. ) extends PersonInfo
object TestObject {
def main(args: Array[String]): Unit = {
val p = new Person("someName", "someAddress", .....)
// and if I want to change one thing, the address for example
val p2 = new Person("someName", "someOtherAddress", .....)
}
}
これは「通常の」scalaのやり方ですか(22個のパラメータの制限に関係なく)? ご覧のとおり、私はこれらすべてに非常に慣れていません。
まず、Tony K. の基本的なオプション:
def withName(n : String) = Person(n, アドレス)
有望に見えましたが、PersonInfo を拡張するクラスがかなりあります。つまり、簡単なことをするために、定義を再実装し、多くのタイピングとカット アンド ペーストを行う必要があります。特性 PersonInfo を通常のクラスに変換し、その中にすべての定義を入れると、PersonInfo ではなく Person を返すにはどうすればよいかという問題があります。どういうわけかトレイトまたはスーパークラスに実装し、すべてのサブクラスを実際に拡張する賢いスカラはありますか?
私が見る限り、例が非常に単純で、2 つまたは 3 つのパラメーターの場合、scala ではすべてが非常にうまく機能しますが、数十のパラメーターがある場合、非常に退屈で機能しなくなります。
oddcanada の PersonContext も似たようなものだと思いますが、これはまだ考え中です。43 個のパラメーターがある場合、パラメーターを Person に送り込むためだけに、複数の一時クラスに分割する必要があると思います。
コピー オプションも興味深いもので、難解ですが、タイピングははるかに少なくなります。
Javaから来て、scalaからの巧妙なトリックを期待していました。