Почему этот Руби не прерывает каждый цикл? - PullRequest
4 голосов
/ 12 августа 2010

У меня есть следующий код в одном из моих личных проектов:

def allocate(var, value) # Allocate the variable to the next available spot. 
  @storage.each do |mem_loc|
    if mem_loc.free?
      mem_loc.set(var, value) # Set it then break out of the loop.
      break
    end
  end
end

Каждый элемент в массиве хранения - это объект, который отвечает бесплатно?и установить.То, что я пытаюсь сделать, это циклически проходить по массиву в поисках следующего свободного (пустого) объекта для установки переменной.Моя проблема в том, что это просто циклически перебирает все объекты и устанавливает их все.Я неправильно использую функцию прерывания?

Тестируя ее, я вызываю следующее:

store.allocate(:a, 10)
store.allocate(:b, 20)

Так что store [1] должен быть установлен в: b и 20. Но когда я выводусодержимое, это значение равно 10, как и остальная часть массива.

1 Ответ

2 голосов
/ 12 августа 2010

Я считаю, что нашел ошибку, и на самом деле ее не было в приведенном выше коде. Когда я настроил массив хранения, я сделал так:

@storage = [Memory_location.new] * 1000

Верить, что это создаст 1000 различных объектов. Я думаю, что на самом деле произошло то, что он создал 1000 ссылок на один и тот же объект 1004 *, поэтому, когда я изменил один из них, я изменил все из них. Я мог бы доказать это, используя метод put в двух разных местах массива, причем оба возвращали:

#{Memory_location:0x2bc8b74}
...