列表和统一访问原则

时间:2013-03-10 12:56:43

标签: scala uniform-interface

我有以下代码,我想知道为什么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

无论如何,有没有更好的方法呢?

1 个答案:

答案 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仅适用于特殊情况,因为通常您不知道列表是否至少包含一个项目。因此,使用模式匹配是一种更好的方法。