Ruby - работа с хешем объектов - PullRequest
0 голосов
/ 05 августа 2010

У меня проблема с хэшем объектов.Мои хэши - это имена игроков, и у объекта также есть свойство @name.

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

puts "Who all is playing?"
gets.split.each do |p|
    players[p] = Player.new(p)
end

И затем я хочу перебрать игроков таким образом, но это не работает.

players.each_key do |p_name, obj|
    puts obj.name + " turn"

Однако это работает:

players.each_key do |p_name, obj|
    puts players[p_name].name + " turn"

С первой попытки я получаю ошибку, что obj равен nil.Может кто-нибудь объяснить, почему это не сработает, и как это сделать так, как я хотел бы?

Спасибо!

PS Какова правильная терминология для массива или хэша, которые я сделал?Я пришел из PHP, поэтому я думаю о нем как о массиве (с хешами), но технически это не массив в Ruby?

Ответы [ 2 ]

3 голосов
/ 06 августа 2010

P.S. Какова правильная терминология для массива или хэша, которые я сделал? Я пришел из PHP, поэтому я думаю о нем как о массиве (с хешами), но технически это не массив в Ruby?

Это называется Hash в Ruby, и это не то же самое, что массив. Хэши создаются с:

my_hash = Hash.new

или

my_hash = {}

Пока массивы выполняются так:

my_array = Array.new

или

my_array = []

Хэши Ruby - это ассоциативные массивы , подобные "массивам" в PHP. Массивы Ruby больше похожи на традиционные массивы "C" в том смысле, что они индексируются целыми числами.

3 голосов
/ 06 августа 2010

Вы хотите использовать each_pair, а не each_key.Метод each_key дает блоку только один аргумент, который является ключом.Поэтому ваши obj остаются несвязанными.each_pair, с другой стороны, дает вам и ключ, и соответствующее значение.

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