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通常、リストに少なくとも 1 つのアイテムがあるかどうかわからないため、リストでの使用は特別な場合にのみ使用します。したがって、ここではパターン マッチングを使用する方が適切なアプローチです。

于 2013-03-10T14:15:09.237 に答える