【发布时间】:2009-11-10 20:05:08
【问题描述】:
现在我有这样的课程:
abstract class Record {
// Required fields
val productCode:Option[String]
val price:Option[Double]
// Optional fields
val notes:Option[String] = None
val used:Option[Boolean] = Option(false)
}
然后创建它们:
val r = new Record {
override val productCode = Option("abc")
override val price = Option(32.12)
}
需要注意的几点:
- 我将 Option 用于非可选字段,以便 一种。我不必记住哪些字段是可选的 湾。我可以在不更改界面的情况下更改哪些字段是可选的
- Option 的东西增加了很多噪音。我希望它不存在,但我也不想使用空值。当我使用该结构时,考虑到所有对 getOrElse 的调用时尤其如此。 (我敢打赌,该语言有一种巧妙的方式来声明性地自动装箱。)
-
如果子类混合了新字段,例如:
override val List(productCode, price, discount) = fields // fields is a List
不会编译,因为discount 没有在超类中定义,因此没有覆盖。我不确定是否有办法做到这一点。
我的主要问题是:
- 是否有更好的整体方法来管理不可变数据结构?
- 是否有一种直接的方法可以复制记录并仅更改一个值而无需编写样板代码?
例如(伪代码}:
val r2 = r.clone { override val used = true }
我听说 2.8 为案例类引入了类似的东西,但是在一种鼓励不可变数据结构的语言中,我会惊讶地发现这在 2.8 之前并不容易。我还在 2.7 中。
【问题讨论】:
标签: scala functional-programming