2013-03-10 28 views
0

我有以下代碼,我想知道爲什麼list.head.effects =部分是必要的。據我的理解,統一訪問princile說,該列表應該只返回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 

無論如何,有沒有更好的方法來做到這一點?

回答

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僅適用於特殊情況,因爲通常您不知道列表是否至少有一個項目。因此使用模式匹配是一種更好的方法。