【发布时间】:2012-09-16 06:36:35
【问题描述】:
是否可以通过 Scala 中的继承来构建不可变列表?我有一个创建 MenuBar 的基本特征。 MenuBar 将具有标准标题:文件、编辑、视图/窗口、帮助等。我希望继承特征能够将子项添加到菜单标题。我希望动态创建菜单,因此将有一个函数列表,当打开菜单以创建子树时将调用这些函数。由于函数列表将在编译时知道,如果它可以是一个不可变列表会很好。
Scala 中是否有任何方法可以通过构造函数/初始化层次结构创建不可变列表?如果不是在 Scala 中,是否有任何语言提供此功能?
用一个使用可变列表的简单示例来说明问题。 TrA 和 TrB 是相互独立编写的:
trait Base
{
val list = scala.collection.mutable.LinkedList[String]()
}
trait TrA extends Base
{
list += "A"
}
trait TrB extends Base
{
list += "B"
}
val ab = new TrA with TrB {}
由于 List 的内容在编译时是已知的,是否有使其成为 val 不可变列表? 当然,任何可变集合都可以通过 def 调用作为不可变集合公开。
以下将编译:
trait Base
{ val list: List[String] = Nil }
trait TrA extends Base
{ val list = "A" :: super.list }
trait TrB extends Base
{ val list = "B" :: super.list }
val ab = new TrA with TrB {}
但它不能在不抛出空异常的情况下被初始化。使 val list 变得懒惰也无济于事,因此需要 0__ 的解决方案。
【问题讨论】:
-
您能否提供一个示例(伪)代码来显示您想要实现的目标?
-
@PetrPudlák 希望添加的代码可以解释问题。
标签: scala immutability multiple-inheritance scala-collections