2013-10-12 7 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 

и Driver File:

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

@hand является экземпляром Hand, и не существует никакого метода экземпляра each определен для Hand, так что почему @hand.each генерирует ошибку undefined method.

+0

спасибо, это имеет смысл. Мне непонятно, как бы я перебирал массив в классе колоды, определенный в классе рук, чтобы перечислить все карты, которые были добавлены в руку в классе колоды. – user2872898

+0

Вам нужно будет определить метод 'each' в' Hand' или установить 'Hand' в качестве подкласса класса, который предоставляет такой метод (например,' Array'). –

+0

Добро пожаловать в переполнение стека. :-) Если вы чувствуете, что этот пост не согласился ответить на ваш вопрос, не стесняйтесь оставлять свой вопрос открытым для дополнительных ответов. В противном случае вы можете «принять» его. –

0

Мой ответ не очень прямо на ошибке, но, надеюсь, вам поможет в этом случае.

  1. Вы метод deal_cards где Dependency Injection может сыграть свою роль. По оригинальному дизайну Deck имеет жесткую зависимость от Hand, что плохо и сложно проверить. Вы должны изменить его, как

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

    К этому вы можете принять экземпляр за пределами Hand, скажем Foot до тех пор, как кто-то может играть в карты на ногах! Вы также можете выполнить модульное тестирование этого метода без написания класса рук вообще.

  2. Лучше, чтобы тестировать класс вместо ручной проверки, тогда вы можете ввести любой экземпляр, который вам нравится, во время тестирования.

Смежные вопросы