Scala - Vector.tabulate和结构共享

时间:2014-07-08 13:23:50

标签: scala functional-programming

假设我有一个代表棋盘的值

val board: Vector[Vector[Option[Piece]]] = ...

并且在某些函数中应用移动我使用制表来构建一个新的板

Vector.tabulate(8,8)(
  (x,y) => 
    if (x,y) == (start_x,start_y)
      None
    else if (x,y) == (end_x,end_y)
      board(start_x)(start_y)
    else
      board(x)(y)
)

此片段的内存使用量是否会保持不变,因为只更改了两个单元格?换句话说,数据是否被重用?

1 个答案:

答案 0 :(得分:2)

不,新电路板和旧电路板之间不会有结构共享。如果你在这段代码之后抛出旧的电路板,内存将是不变的,但使用尽可能多的旧电路板会更有效。尝试:

val piece = board(start_x)(start_y)
val board2 = board.updated(start_x, board(start_x).updated(start_y, None))
val newboard = board2.updated(end_x, board2(end_x).updated(end_y, piece))