2011-08-01 3 views
0

私のコードがswitchステートメントを実行することはないようです。 Deckオブジェクトを作成するたびに、すべてのCardオブジェクトはスーツと名前の両方にnilを持ちます。誰か助けてくれますか?Rubyのケースステートメントのヘルプが必要

class Card 
def initialize (suit, number, name) 
    @suit = suit 
    @number = number 
    @name = name   # 
end 
attr_reader :suit, :number, :name 
end 

class Deck 
     def initialize 
      @deck = Array.new 
      for i in 0...4 
       suit = case i 
        when i == 0 then "Spades" 
        when i == 1 then "Hearts" 
        when i == 2 then "Diamonds" 
        when i == 3 then "Clubs" 
       end 
      puts i 
      puts suit  #Debug only 
      for j in 2...15 
       name = case j 
        when j == 2 then "Two of #{suit}" 
        when j == 3 then "Three of #{suit}" 
        when j == 4 then "Four of #{suit}" 
        when j == 5 then "Five of #{suit}" 
        when j == 6 then "Six of #{suit}" 
        when j == 7 then "Seven of #{suit}" 
        when j == 8 then "Eight of #{suit}" 
        when j == 9 then "Nine of #{suit}" 
        when j == 10 then "Ten of #{suit}" 
        when j == 11 then "Jack of #{suit}" 
        when j == 12 then "Queen of #{suit}" 
        when j == 13 then "King of #{suit}" 
        when j == 14 then "Ace of #{suit}" 
       end 
       puts j 
       puts name #Debug only 
       @deck.push(Card.new(suit, j, name)) 
      end 
     end 
    end 
    attr_reader :deck  
end   
+1

以下の繰り返しが少ないです: 'suit =%w [Spades Hearts Diamonds Clubs] [i];名前=%w [二三四四五四七八十九十九クイーンキングエース] [j-2] + "#{suit}"の ' –

答えて

8

。だからあなたはもっと似たものが欲しい:

​​
6

あなたのcase文では、実際のブール値の比較が含まれているはずの、代わりのように、リテラルでなければなりません:case文が暗黙的に===演算子を適用し

case j 
when 2 
"Two of #{suit}" 
when 3 
"Three of #{suit}" 
end 
+0

ありがとう、あなたの答えはあまりにも大きかった。 – Ridwan

0

ジェレミーとコーディは既に正しいと答えた。ちょっと別のビュー:

あなたのwhen句のテストはi == 0です。この比較はtrueまたはfalseを返します。 だから、あなたが真のためにテストするとき、あなたのコードが動作することができます:

[0,1,2,3 ].each{|i| 
    print "Test #{i}. Hit: " 
    case true 
     when i == 0 then puts "Spades" 
     when i == 1 then puts "Hearts" 
     when i == 2 then puts "Diamonds" 
     when i == 3 then puts "Clubs" 
    end 
} 

このようなコードを使用しないでください。それはうまくいくかもしれませんが、ナンセンスです。

[0,1,2,3 ].each{|i| 
    print "Test #{i}. Hit: " 
    case i 
     when 0 then puts "Spades" 
     when 1 then puts "Hearts" 
     when 2 then puts "Diamonds" 
     when 3 then puts "Clubs" 
    end 
} 
1

を開始するには、このためにcaseを使用する理由:ジェレミーとコーディが既に掲載コードを使用してください。あなたはハッシュを必要としません、カップルは配列がうまくいくでしょう:

suits = %w{Spades Hearts Diamonds Clubs} 
values = %w{- - Two Three Four Five Six Seven Eight Nine Ten Jack Queen King Ace} 
deck = suits.map do |s| 
    (2..14).map do |i| 
    Card.new(s,i,"#{values[i]} of #{s}") 
    end 
end.flatten 
関連する問題