价值问题由于某种原因而改变

时间:2019-06-05 22:03:15

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

只需在控制台中运行此代码。 问题是由于某些原因,@ 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]]

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