Нужна помощь с заявлениями по делу Ruby - PullRequest
0 голосов
/ 02 августа 2011

Кажется, будто мой код никогда не проходит через оператор switch.Каждый раз, когда я создаю объект Deck, каждый объект Card имеет ноль как для масти, так и для имени.Кто-нибудь может мне помочь?

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          

Ответы [ 4 ]

8 голосов
/ 02 августа 2011

Оператор case неявно применяет оператор ===. Итак, вы хотите что-то еще как:

case j
when 2 then "Two of #{suit}"
when 3 then "Three of #{suit}"
# ...
end
6 голосов
/ 02 августа 2011

Ваш оператор case не должен содержать фактических логических сравнений, но вместо этого должен быть литералами, такими как:

case j
when 2
 "Two of #{suit}"
when 3
 "Three of #{suit}"
end
1 голос
/ 02 августа 2011

Нет причин использовать 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
0 голосов
/ 02 августа 2011

Джереми и Коди уже ответили правильно. Просто другой взгляд:

Ваш тестовый оператор для i == 0. Это сравнение возвращает true или false. Итак, когда вы проверяете на true, ваш код может работать:

[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
}
...