2013-07-17 33 views
1

可能是提出問題的最糟糕方式,但我是新手,並且盡我所能解釋我的問題。我想(想)當我期望我的數組只有2個可用屬性時,我收到對象

我正在實現一個Ruby Blackjack遊戲。你可以看到我在這裏的回購/來源:https://bitbucket.org/subem81/blackjack

這是關注的特定部分(保存在「手」模塊中,包含在使用我認爲是mixin的Dealer和Player類中):

def show_hand 
    if self.class.to_s == 'Dealer' 
     self.hand.each do |card| 
      card.show_card 
     end 
    elsif self.class.to_s == 'Player' 

    else 
     puts "A Random person is showing their hand." 
    end 

end 

它調用每個Card對象的show_card()方法。或者我想。我一直在卡對象上沒有方法錯誤。這是錯誤:

$ ruby blackjack.rb 
Welcome to Mike's Blackjack. 
blackjack.rb:35:in `block in show_hand': undefined method `show_card' for 
[# <Card:0x007fe504110918 @suit="Spades", @card_type="King">]:Array (NoMethodError) 
from blackjack.rb:34:in `each' 
from blackjack.rb:34:in `show_hand' 
from blackjack.rb:21:in `setup_players' 
from blackjack.rb:6:in `initialize' 
from blackjack.rb:116:in `new' 
from blackjack.rb:116:in `<main>' 
+0

既然您是Ruby的新手,我只想指出您可以直接寫'if self.class == Dealer'而不是將類轉換爲字符串。 –

+0

如果你只是打開它所在的類,就不需要使用這樣的模塊。只需在每個類中實現不同的行爲。 –

+0

andrew.cuthbert - 感謝指針! @AndrewMarshall我同意這個模塊。我用它只是爲了在這裏強化自己的概念。我意識到是違反了模塊的目的,因爲它是個別化的使用它的其他類。是否還有其他類型的問題?這不是諷刺,因爲我基本上都在教導我自己的這些原則,所以我會認真地喜歡你們所有人的意見。謝謝大家! –

回答

3

Deck.give_card您正在返回cards_sent通過彈出一個參數。這將返回一個數組。所以經銷商和玩家的手將是一系列卡片。 (彈出沒有參數,返回一個單一的項目。)

從你的錯誤:

undefined method `show_card' for [# ]:Array

您可以更改:

  @dealer.hand << @deck.give_card 
      @player.hand << @deck.give_card 
      @dealer.hand << @deck.give_card 
      @player.hand << @deck.give_card 

到:

  @dealer.hand += @deck.give_card 
      @player.hand += @deck.give_card 
      @dealer.hand += @deck.give_card 
      @player.hand += @deck.give_card 

或重命名你的give_card給卡片並添加一個新的卡片:

def give_card 
     @cards.pop 
    end 
+0

哇..謝謝肖恩!我甚至查看了文檔,但沒有注意到返回的不同類型,甚至沒有考慮到它。這是一個很大的幫助。謝謝! –

相關問題