0

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

无论如何,有没有更好的方法来做到这一点?

4

1 回答 1

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

于 2013-03-10T14:15:09.237 回答