2013-03-24 102 views
0

我正在一個小二十一點模擬器上工作。我希望我的卡片類根據傳遞給Card.new的參數自動製作Ace而不是卡片。下面是我有:紅寶石:使用新作爲工廠

class Card 

    include Comparable 

    attr_reader :value, :name, :suit 

    def self.new(*args, &block) 
     *args[0] == "A" ? Ace.new(*args[1]) : super(*args, &block) 
    end 

    def initialize(name, suit) 
     return Ace.new(suit) if name == "A" 
     @name, @suit = name, suit 
     @value = ["J", "Q", "K"].include?(name) ? 10 : name.to_i 
    end 

    def <=>(card) 
     @value <=> card.value 
    end 

    def hash 
     @value.hash 
    end 

    def to_s 
     return "#{@name}#{@suit}" 
    end 

    alias eql? == 

end 

class Ace < Card 

    def initialize(suit) 
     @name, @suit, @value = "A", suit, 11 
    end 

    def toggle 
     @value = 1 if @value == 11 
     @value = 11 if @value == 1 
    end 

end 

當我運行了這一切,我不幸找回錯誤:

Blackjack Simulator/cards.rb:22: syntax error, unexpected tEQ, expecting '='if *args[0] == "A" 

如果我沒有記錯的話,我應該能夠* args來讀出像一個正常的數組。這裏有什麼問題?

回答

2

你不需要第二個*

def asdf_method(*args) 
    args.join(' ') # At this point `args` already is an array 
end 

> asdf_method 1, 2, 3, 4 
=> "1 2 3 4"