簡體   English   中英

從另一個類中的方法調用方法

[英]Calling a method from a method in another class

這是眾所周知的。 確定撲克手的等級。 我創建了以下類: 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}"

@handHand的實例,並且沒有為Hand定義each實例方法,因此這就是@hand.each生成undefined method錯誤的原因。

我對錯誤的回答不是很直接,但是希望在這種情況下可以對您有所幫助。

  1. 您可以通過deal_cards方法在依賴注入中發揮作用。 通過最初的設計, DeckHand依賴性Hand ,這不好,也很難測試。 您需要像這樣更改它

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

    這樣,您可以接受“ Hand之外的實例,例如“ Foot ,只要有人可以用腳玩紙牌! 您也可以完全不編寫Hand類就對該方法進行單元測試。

  2. 最好對類進行單元測試而不是手動檢查,然后可以在測試期間將所需的任何實例注入此方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM