2014-09-26 3 views
0

Я пытаюсь использовать жемчужину пароконденсата, чтобы вытащить список игр для определенного пользователя (меня). До сих пор у меня есть следующие:Путаница с хэшами и массивами при использовании пароконденсатора Ruby gem

require 'steam-condenser' 

id = SteamId.new 'tamachan87' 
games_owned = id.games 

games_owned теперь хэш, содержащий ключи и массивы.

Если я позвоню games_owned.values в IRB, я получу результат, который содержит всю информацию об этих играх, начиная с его идентификационного номера и заканчивая его именем.

Однако, когда я использую следующее:

games_owned.each do |key, array| 
    puts "==== #{key} ====" 
    puts array 
end 

Я получаю только первое значение массива, такие как:

==== 200260 ==== 
#<SteamGame:0x00000100beb0a8> 

Каждое значение/массив вещь имеет @name переменную, которая является Единственное, что я хочу потянуть.

Может ли кто-нибудь помочь мне лучше понять эти хэши и как я могу извлечь конкретные данные (@name)?

Заранее спасибо.

+1

Попробуйте 'p array' вместо' puts'. –

ответ

1

Возвращаемое значение SteamId#games не является хешем массивов, это хэш SteamGame объектов.

Ваш пример код может быть написан так:

games_owned.each do |app_id, game| 
    puts "==== #{app_id} ====" 
    puts game.name 
end 

Смотрите documentation of SteamId для получения дополнительной информации.

1

Причина, по которой вы получаете недружественное имя класса и значение памяти, состоит в том, что класс SteamGame не определяет метод inspect. Однако, если все вы заинтересованы в печати названия игр, используйте puts key.name

1

Если вы хотите напечатать ваш объект Steamgame в довольно способом, используя «путы» следует перезаписать «to_s» в классе Steamgame.

Причина, по которой вы получаете разные результаты: puts использует метод to_s для печати своего аргумента (который является объектом самого пародия в вашем случае с конкретным идентификатором). Если вы используете «p» или «puts array.inspect» вместо «puts», он будет отлаживать ваш объект, и вы увидите результаты, похожие на irb.

Если у вас есть атрибут типа @name в вашем классе Steamgame, вы должны получить его, просто произнесите: games_owned.values ​​[i] .name или поместите имя массива. Вы попробовали?