2013-06-08 2 views
1

Я довольно новичок в Ruby (я исхожу из фона C++), и у меня есть массив/хэш объектов по их имени, но мне не повезло, когда пытаюсь получить доступ к их переменным , Это моя попытка:Хэш/массив объектов в Ruby

class Foo 
attr_reader :num 

def initialize(num) 
    @num = num 
end 
end 

foo_list = {} 

foo_list["one"] = Foo.new("124") 
foo_list["two"] = Foo.new("567") 

foo_list.each do |foo| 
p "#{foo.num}"    # ERROR: undefined method 'num' 
end 

Я уверен, что есть простой способ сделать то, что мне нужно, может быть, даже не используя «каждый», но что-то еще?

+1

Просто совет, вы можете распечатать 'foo' в блоке, чтобы увидеть, что на самом деле' foo'. Кроме того, документация Ruby довольно хороша. Просто googling для «рубинового хэша», а затем поискать «каждый» метод, поставил бы вас на правильный путь. http://ruby-doc.org/core-2.0/Hash.html#method-i-each – gylaz

+0

Или, если вы позволите Ruby построить свою встроенную документацию, 'ri Hash' в командной строке покажет различные методы. 'ri ​​Hash.each' предоставил бы больше информации, специфичной для' each'. –

ответ

1

Не должно быть foo_list.each do |key, foo|, учитывая, что foo_list является хеш-образцом?

+0

OMG, я чувствую себя глупо, на это уходит час моей жизни. Благодаря! –

4

Вы могли бы искать для этого:

foo_list.each do |key, value| 
    puts "#{key}: #{value}" 
end 

Или вы можете расширить свой собственный пример (Foo будет массив здесь, содержащий ключ и значение):

foo_list.each do |foo| 
    puts "#{foo[0]}: #{foo[1]}" 
end 

Или вы могли бы сделать это без каждого:

puts "one: #{foo_list["one"]}" 
puts "two: #{foo_list["two"]}" 

Удачи, изучая Рубин! :-)

Смежные вопросы