0

我有一个继承自 Array 的类(实际上,它只是多维数组的掩码)。我想覆盖它的to_a方法:

def to_a
    self.each.with_index { |el, i| el.map {|j| j} }
end

但这搞砸了:当我尝试测试我的功能时:

it 'should be non destructive' do
    a_board = Representation.new(@a_size)
    a_clean_board = Representation.new(@a_size)
    expect(a_board).to eq(a_clean_board)

    # Try to modify a_board
    arr = a_board.to_a
    arr.pop
    a_board.to_a.pop

    # Check that it stayed equal to a_clean_board
    expect(a_board).to eq(a_clean_board)
end

两者都要求对pop原始电路板产生副作用。

我怎样才能避免这种情况?

4

1 回答 1

2

可能是因为它返回对同一对象的引用。为了避免这种使用map,而不是each最后使用 .dup 。

UPD

正如我所说,只需使用地图。就像在函数式编程中故意没有副作用一样。例子:

class WrappedArr < Array
  def to_a
    map { |el| el.map {|el2| el2 } }
  end
end

w_arr = WrappedArr.new([[1,2], [2,3]])
# => [[1, 2], [2, 3]]

2.0.0p247 :012 > w_arr.to_a.object_id # always different as it is different object
#=> 70318090081080
2.0.0p247 :013 > w_arr.to_a.object_id
# => 70318095088040
2.0.0p247 :014 > w_arr.to_a.object_id
# => 70318095081540

# final test
2.0.0p247 :015 > w_arr.to_a.pop
# => [2, 3]
2.0.0p247 :016 > w_arr
# => [[1, 2], [2, 3]]
于 2013-10-13T11:23:05.230 回答