我有以下代码,我想知道为什么list.head.effects =
部分在这里是必要的。根据我的理解,统一访问原则表示该列表应仅由list.head.effects
返回,此时我可以访问该列表。但是为了让任务真正起作用,我需要拥有它,因为它在下面。
它会评估Entrance :: list.head.effects
但是不会将其分配到任何地方吗?我在可变世界中还是太深了吗?
def addEntrance(list: List[Tile]) = list.head.effects = Entrance :: list.head.effects
case class Tile(x: Int, y: Int) {
var effects: List[_ >: Effect] = List()
}
case class Entrance extends Effect
无论如何,有没有更好的方法呢?
答案 0 :(得分:3)
::
创建一个新列表,其中左侧参数被添加到右侧列表中。这不会改变或分配任何东西。没有var
的不可变解决方案可能是:
case class Tile(x: Int, y: Int, effects: List[_ >: Effect] = List())
case class Entrance extends Effect
def addEntrance(list: List[Tile)) = list match {
case Tile(x,y,effects) :: tail => Tile(x,y,Entrance() :: effects) :: tail
case Nil => ...
}
这里addEntrance
返回一个更新的列表,这是处理不可变列表的方法。
顺便说一句:在列表中使用.head
仅适用于特殊情况,因为通常您不知道列表是否至少包含一个项目。因此,使用模式匹配是一种更好的方法。