Рубиновый вопрос новичка: хэши - PullRequest
3 голосов
/ 11 мая 2009

у меня есть следующее

class test
 hash={}

  def printHash 
      puts hash[1]
      puts hash[2]
      puts hash[3]
    end
end

test.new.printHash

это печатает:

1 
0 
1

Почему это происходит? Как я могу проверить, положил ли я что-то в это место хэша? или я что-то упустил

Ответы [ 2 ]

10 голосов
/ 11 мая 2009

Вы не в курсе, но похоже, что он делает что-то , потому что hash является встроенной функцией , которая возвращает хеш-код Fixnum для объекта. Когда вы используете квадратные скобки в Fixnum, вы получаете значение определенного бита . То, что вы хотите сделать, это создать переменную экземпляра, которая начинается с символа @. Кроме того, вы должны создать переменные экземпляра внутри метода, поэтому мы будем использовать ту, которая вызывается при создании объекта класса, initialize:

class Test
  def initialize
    @hash = {}
  end

  def printHash 
      puts @hash[1]
      puts @hash[2]
      puts @hash[3]
  end
end

Теперь вы найдете этот отпечаток nil для всех трех. Чтобы проверить, имеет ли хеш значение для определенного ключа, вы можете использовать has_key?.

0 голосов
/ 11 мая 2009

По сути, 'hash' находится вне области видимости. То, на что вы ссылаетесь в своей функции printHash, это вообще другой объект, обычно это будет nil (новый неназначенный объект), но, как указывает Песто, 'hash' - встроенная функция - несколько запутывает это объяснение.

Поместив знак '@' перед вашей переменной и присвоив его в методе initialize (который вызывается после 'new'), он становится доступным во всем экземпляре вашего объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...