我之前提出过一个问题:I (think) I'm getting objects returned when I expect my array to have just 2 properties available 这可能会给一些背景。收到解决方案之后,我立即转向展示每个玩家的手牌。以下模块包含在经销商和玩家类中。
module Hand
def show_hand
if self.class == Dealer
#Need to cover up 1 of the 2 cards here. Dealer doesn't show both!
print "The dealer is showing: "
print self.hand[0].show_card
puts ''
elsif self.class == Player
print "You have: "
self.hand.each do |item|
item.show_card
end
puts ''
else
puts "A Random person is showing their hand."
end
end
end
我知道这种定制会破坏模块的目的,只是用它来强化模块的概念。上述解决方案适用于经销商部分。但是当调用播放器部分时,它会打印一个空白块。在播放器块中的每个“项目”的.inspect上,它确认这些项目实际上是Card对象的预期。这是以前的show_card方法:
def show_card
"[#{@card_type} of #{@suit}]"
end
所以它只返回了一个带有card_type和suit的字符串。 我只需将方法改为:
就可以解决Player对象部分的问题def show_card
print "[#{@card_type} of #{@suit}]"
end
为什么会这样?我假设它与玩家手上的“每个”的调用有关。真的只是好奇有什么区别以及为什么这些Card对象不会在没有显式“print”的情况下打印出来,而是通过String对象返回。
希望我足够描述。这个让我感到困惑,我真的想抓住这些小东西,因为我知道它会防止这样的未来错误。谢谢!
答案 0 :(得分:1)
在Ruby中,您必须使用puts
或print
进行打印。只返回字符串不会打印它。您的经销商类打印的原因是因为您执行了print
,但是在Player
课程中,正如您所说,您没有打印。您只返回了字符串而没有打印。
正如您所说,您可以通过添加打印来解决问题:
def show_card
print "[#{@card_type} of #{@suit}]"
end
你可以这样做:
def show_card
"[#{@card_type} of #{@suit}]"
end
...
module Hand
def show_hand
if self.class == Dealer
#Need to cover up 1 of the 2 cards here. Dealer doesn't show both!
print "The dealer is showing: "
puts self.hand[0].show_card # PRINT THE CARD
elsif self.class == Player
print "You have: "
self.hand.each do |item|
print item.show_card # PRINT THE CARD
end
puts ''
else
puts "A Random person is showing their hand."
end
end
end
这会更“对称”并打印出你想要的东西。
稍微紧凑的是:
def show_card
"[#{@card_type} of #{@suit}]"
end
...
module Hand
def show_hand
if self.class == Dealer
#Need to cover up 1 of the 2 cards here. Dealer doesn't show both!
puts "The dealer is showing: #{self.hand[0].show_card}"
elsif self.class == Player
print "You have: "
self.hand.each { |item| print item.show_card }
puts ''
else
puts "A Random person is showing their hand."
end
end
end