2013-03-17 2 views
0

카드 팩의 경우 :Ruby 해시 - 개체를 채울 때 해시 값을 사용하는 방법?

어떻게 팩을 만들 때 슈트 해시를 사용할 수 있습니까?

나는이 :

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

해쉬의'{}'문법 ('[]'이 아닌)을 사용하도록 업데이트되었지만 같은 오류가 발생했습니다 : ( – 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]'표현식으로 변경했습니다. 그 변화에 대한 생각을 환영합니다 :) – junky

+0

btw (기타) 궁극적으로 나는 한 문자 정장 이름을 사용할 수 있기를 원하기 때문에 배열보다는 배열을 사용하고 있습니다. 전체 설명. 지금 당장 나는 배열을 사용하고 대문자로 된 첫 글자를 붙잡을 수도 있지만 이것은 숙제 (나는 스스로 설정했다)이며이 문맥에서 해시를 사용하는 방법을보고 싶었다. – 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]