2013-10-12 115 views
0

這是一個相當知名的方法。確定撲克牌的等級。我創建了以下類:Card從另一個類中的方法調用方法

class Card 
    attr_accessor :suite, :rank, :value 
    def initialize(suite, rank, value) 
    @suite = suite 
    @rank = rank 
    @value = value 
    end 
    def to_s 
    puts "#{@value}, #{@suite}, #{@rank}" 
    end 
end 

Deck

class Deck 
    def initialize() 
    @cardsInDeck = 52 
    @deck = Array.new() 
    end 
    def add_card(card) 
    @deck.push(card) 
    end 
    def deck_size 
    @deck.length 
    end 
    def to_s 
    @deck.each do |card| 
     "#{card.rank}, #{card.suite}" 
    end 
    end 
    def shuffle_cards 
    @deck.shuffle! 
    end 
    def deal_cards 
    #Here I create a new hand object, and when popping cards from the deck    
    # stack I insert the card into the hand. However, when I want to print 
    # the cards added to the hand I get the following error: 
    #  : undefined method `each' for #<Hand:0x007fa51c02fd50> (NoMethodError)from 
    #  driver.rb:36:in `<main>' 
    @hand = Hand.new 
    for i in 0..51 do 
     card = @deck.pop 
     @cardsInDeck -= 1 
     puts "#{card.value}, #{card.rank}, #{card.suite}" 
     @hand.add_cards(card) 
    end 
    @hand.each do |index| 
     "#{index.value}, #{index.rank}, #{index.suite}" 
    end 
    puts "Cards In Deck: #{@cardsInDeck}" 
    end 
end 

Hand

require_relative 'deck' 
require_relative 'card' 

class Hand 
    def initialize() 
    @hand = Array.new() 
    end 
    def to_s 
    count = 0 
    @hand.each do |card| 
     "#{card.value}, #{card.rank}, #{card.suite}" 
     count += 1 
    end 
    end 
    def add_cards(card) 
    @hand.push(card) 
    end 
    def hand_size() 
    @hand.length 
    end 
end 

和驅動程序文件:

require 'logger' 
require_relative 'card' 
require_relative 'deck' 
require_relative 'hand' 

suite = ["Hearts", "Diamonds", "Clubs", "Spades"] 
rank = ["Ace", 2, 3, 4, 5, 6, 7, 8, 9, 10, "Jack", "Queen", "King"] 
deck = Deck.new() 
suite.each do |i| 
    v = 1 
    rank.each do |j| 
    deck.add_card(Card.new(i, j, v)) 
    v += 1 
    end 
end 

Deck類中,deal_card方法,我不理解爲什麼循環用於陣列引起的方法錯誤

@hand.each do |index| 
    "#{index.value}, #{index.rank}, #{index.suite}" 
end 
puts "Cards In Deck: #{@cardsInDeck}" 

回答

0

@handHand一個實例,並且對於Hand定義沒有實例方法each,所以這就是爲什麼@hand.each正在生成一個undefined method錯誤。

+0

謝謝,這很有道理。我不清楚我如何循環在手牌類中定義的甲板類中的陣列,以便列出所有已添加到甲板類中的手牌。 – user2872898

+0

您需要在'Hand'中定義'each'方法或者將'Hand'定義爲提供這種方法的類的子類(例如'Array')。 –

+0

歡迎使用堆棧溢出。 :-)如果您覺得這篇文章不能令人滿意地回答您的問題,請隨時留下您的問題以獲取更多回復。否則,你可能想要「接受」它。 –

0

我的回答不是非常直接的錯誤,但可能有希望在這種情況下幫助你。

  1. 你方法deal_cards就是依賴注入可以發揮它的作用。由原始設計DeckHand有很大的依賴性,這不太好也難以測試。你需要改變它像

    def deal_cards(hand=nil) 
        @hand = hand || Hand.new 
        # Others 
    end 
    

    通過這個你可以的Hand接受外界例如,假設Foot只要有人能用腳打牌! 你也可以單獨測試這個方法,根本不寫Hand類。

  2. 更好地單元測試類而不是手動檢查,然後您可以在測試過程中將任何喜歡的實例注入此方法。

相關問題