学习Ruby,我正在创建一个Battleship项目,我有以下代码作为我正在创建的类"Board"的实例方法.
def hidden_ships_grid
hidden_s_grid = @grid.dup
hidden_s_grid.each_with_index do |sub_array, i|
sub_array.each_with_index do |el, j|
# position = [i, j]
hidden_s_grid[i][j] = :N if el == :S
end
end
end
Run Code Online (Sandbox Code Playgroud)
基本上这个方法会创建一个@grid变量的另一个实例,它将用:N代替每个:S符号.
RSPEC有两个要求:1)"应该返回一个表示网格的2D数组,其中每个:S被替换为:N"和2)"不应该改变原始的@grid".
我的问题是我的上述代码满足第一个要求,但它打破了第二个要求.有人可以向我解释是什么原因导致原始的@grid文件发生变异?我已经完成了15次代码,我无法看到我重写或重新分配原始@grid变量的位置.
提供给我们的"正确"解决方案使用".map",这很好,但我想了解为什么这个解决方案不起作用并最终改变原始的@grid变量.
1) Board PART 2 #hidden_ships_grid should not mutate the original @grid
Failure/Error: expect(board.instance_variable_get(:@grid)).to eq([[:S, :N],[:X, :S]])
expected: [[:S, :N], [:X, :S]]
got: [[:N, :N], [:X, :N]]
(compared using ==)
Diff:
@@ -1,2 +1,2 @@
-[[:S, :N], [:X, :S]]
+[[:N, :N], [:X, :N]]
Run Code Online (Sandbox Code Playgroud)
提前致谢!
ruby ×1