2013-03-17 2 views
0

Для пакета игральных карт:Ruby hash - как использовать значение хэша при заполнении объекта?

Как я могу использовать хэш костюма (ниже) при создании пакета?

у меня есть:

class PackOfCards 

    SUITS={H: 'Hearts', S:'Spades', D:'Diamonds', C:'Clubs'} 
    CARDS=['A','2','3','4','5','6','7','8','9','10','J','Q','K'] 


    attr_accessor :pack_name, :cards 

    def initialize(pack_name) 

    @pack_name= pack_name 
    @cards = [] 
    (0..3).each do |suit| 
     (0..12).each do |number| 
     @cards << PlayingCard.new(self, (SUITS[suit].value), CARDS[number]) 
     end 
    end 
    end 
end 

class PlayingCard 

    attr_accessor :pack, :card_number, :card_suit 


    def initialize(pack, suit, number) 
    @card_suit = suit 
    @card_number = number 
    end 

end 

, но я получаю:

pack_of_cards.rb:16:in `block (2 levels) in initialize': 
undefined method `value' for 
{:H=>"Hearts", :S=>"Spades", :D=>"Diamonds", :C=>"Clubs"}:Hash (NoMethodError) 
+0

'SUITS' является недействительным выражением рубина , – sawa

+0

Обновлен для использования синтаксиса '{}' hash ''}, но такая же ошибка :( – junky

ответ

1

Вот исправленная версия, проверьте комментарии:

class PackOfCards 
    SUITS={H: 'Hearts', S:'Spades', D:'Diamonds', C:'Clubs'} # Use curly braces to define a hash, [] braces will define an array containing one hash 
    CARDS=['A','2','3','4','5','6','7','8','9','10','J','Q','K'] 
    attr_accessor :pack_name, :cards 

    def initialize(pack_name) 
    @pack_name= pack_name 
    @cards = [] 
    SUITS.each_key do |suit| # each_key is better since it gives you the key of the hash 
     (0..12).each do |number| 
     puts PackOfCards::SUITS[suit] 
     @cards << PlayingCard.new(self, (PackOfCards::SUITS[suit]), PackOfCards::CARDS[number]) # Call the hash with the right key to get the Suit 
     end 
    end 
    end 
end 

class PlayingCard 
    attr_accessor :pack, :card_number, :card_suit 

    def initialize(pack, suit, number) 
    @card_suit = suit 
    @card_number = number 
    end 

end 
+0

Да, мне это нравится. Я изменил выражение 'PackOfCards :: SUITS [suit]' на 'SUITS [suit]' as он находится внутри класса. Я приветствую мысли об этом изменении :) – junky

+0

btw (others) Я использую хеш, а не массив (который я использовал изначально), потому что в конечном итоге я хочу иметь возможность использовать либо имя одной буквы или полное описание. Прямо сейчас я мог бы просто использовать массив и захватить заглавную первую букву, но это домашнее задание (которое я установил) и хотел бы посмотреть, как использовать хэш в этом контексте. – junky

2

Ваш SUITS является недействительным выражение. Возможно, вы хотели бы сделать это:

SUITS = %w[Hearts Spades Diamonds Clubs] 

И не ясно, что вы делаете, но, возможно, вы должны делать это:

@cards = 
SUITS.flat_map{|suit| CARDS.map{|number| PlayingCard.new(self, suit, number)}} 
0

Ваше Suit определение и поиск не выглядят действительным ,

Как о чем-то вроде этого (предполагая, что выход является колода карт со всеми костюм и номеров) -

class PackOfCards 

    SUITS = ['Hearts', 'Spades', 'Diamonds', 'Clubs'] 
    CARDS=['A','2','3','4','5','6','7','8','9','10','J','Q','K'] 


    attr_accessor :pack_name, :cards 

    def initialize(pack_name) 

    @pack_name= pack_name 
    @cards = [] 
    (0..3).each do |suit| 
     (0..12).each do |number| 
     @cards << PlayingCard.new(self, (SUITS[suit]), CARDS[number]) 
     end 
    end 
    end 
end 

class PlayingCard 

    attr_accessor :pack, :card_number, :card_suit 


    def initialize(pack, suit, number) 
    @card_suit = suit 
    @card_number = number 
    end 

end 
0

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

SUITS.first[:H] 
Смежные вопросы