Проблема со значением, которое меняется по какой-то причине - PullRequest
0 голосов
/ 06 июня 2019

Просто запустите этот код в консоли. Проблема в том, что @notes_ перед изменением значения после вызова метода "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

Я ожидаю, что вывод @notes_before будет [[0, 0], [0, 1]] после вызова a.move, но фактический вывод будет [[1, 0], [1, 1]]

1 Ответ

1 голос
/ 06 июня 2019

Вы копируете массив по ссылке, а не по значению.Поэтому, когда изменяется первый массив, изменяется и второй, потому что они имеют одну и ту же ссылку.

Что вы можете сделать, чтобы избежать этой проблемы:

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
...