【发布时间】:2012-11-30 22:25:10
【问题描述】:
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。 据我了解 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 的类。 这意味着在每一个中我都必须重新实现 defs,大量的打字、剪切和粘贴, 只是做一些简单的事情。 如果我将特征 PersonInfo 转换为普通类并将所有定义放入其中,那么 我有一个问题,我怎样才能返回一个人,而不是一个人信息? 是否有一个聪明的 scala 东西可以以某种方式在 trait 或 super 类中实现并拥有 所有子类真的扩展了吗?
据我所见,当示例非常简单时,所有在 scala 中的工作都非常好, 2 或 3 个参数,但当你有几十个时,它变得非常乏味和不可行。
奇怪加拿大的PersonContext 是我觉得类似的,还在想这个。我猜如果 我有 43 个参数,我需要分解成多个临时类来抽水 将参数放入 Person 中。
复制选项也很有趣,很神秘,但打字少了很多。
来自 java 我希望从 scala 中获得一些聪明的技巧。
【问题讨论】:
标签: scala