val 和 var 在 scala 中,我认为这个概念是可以理解的。
我想做这样的事情(类似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。据我了解 val 在scala中是“首选”。val 如何在这种类型的示例中工作,而不必在每次更改其中一个参数时都重写所有 30 多个参数?
也就是说,我可以
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, address)
看起来很有希望,但我有很多扩展 PersonInfo 的类。这意味着在每一个中我都必须重新实现定义,大量的打字和剪切和粘贴,只是为了做一些简单的事情。如果我将特征 PersonInfo 转换为普通类并将所有定义放入其中,那么我会遇到如何返回 Person 而不是 PersonInfo 的问题?是否有一个聪明的 scala 东西可以以某种方式在 trait 或超类中实现并让所有子类真正扩展?
据我所见,当示例非常简单时,2 或 3 个参数在 scala 中所有工作都非常好,但是当你有几十个参数时,它变得非常乏味和不可行。
奇怪加拿大的PersonContext 是我觉得类似的,还在想这个。我想如果我有 43 个参数,我需要分解为多个临时类,以便将参数泵入 Person。
复制选项也很有趣,很神秘,但打字少了很多。
来自 java 我希望从 scala 中获得一些聪明的技巧。