只需在控制台中运行此代码。 问题是由于某些原因,@ notes_before在调用方法“ a.move”之后更改值。 如何解决它以及为什么会发生?
class Slider
attr_accessor :position
def initialize(position)
@position = position
@notes_before = Array.new
end
def move
@position.each do |note|
note[0] +=1
end
print @notes_before
end
def update_pos
@position.each do |notes|
@notes_before << notes
end
print @notes_before
end
end
a=Slider.new([[0,0],[0,1]])
a.update_pos
a.move
我希望在调用a.move后@notes_before的输出为[[0,0],[0,1]],但实际输出为[[1,0],[1,1]]
答案 0 :(得分:1)
您正在按引用而不是按值复制数组。因此,当第一个数组更改时,第二个数组也更改,因为它们共享相同的引用。
您可以采取以下措施来避免此问题:
class Slider
attr_accessor :position
def initialize(position)
@position = position
@notes_before = Array.new
end
def move
@position.each do |note|
note[0] +=1
end
print @notes_before
end
def update_pos
@notes_before = @position.map(&:clone)
print @notes_before
end
end
a=Slider.new([[0,0],[0,1]])
a.update_pos
a.move