小编use*_*897的帖子

Ruby:如何使用dup/clone来改变原始实例变量?

学习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

4
推荐指数
1
解决办法
111
查看次数

标签 统计

ruby ×1