[英]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}"
@hand
是Hand
的實例,並且沒有為Hand
定義each
實例方法,因此這就是@hand.each
生成undefined method
錯誤的原因。
我對錯誤的回答不是很直接,但是希望在這種情況下可以對您有所幫助。
您可以通過deal_cards
方法在依賴注入中發揮作用。 通過最初的設計, Deck
對Hand
依賴性Hand
,這不好,也很難測試。 您需要像這樣更改它
def deal_cards(hand=nil) @hand = hand || Hand.new # Others end
這樣,您可以接受“ Hand
之外的實例,例如“ Foot
,只要有人可以用腳玩紙牌! 您也可以完全不編寫Hand類就對該方法進行單元測試。
最好對類進行單元測試而不是手動檢查,然后可以在測試期間將所需的任何實例注入此方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.