对于使用相同模块方法的2个类,方法表现不同

时间:2013-07-17 20:11:46

标签: ruby oop blackjack

我之前提出过一个问题: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对象返回。

希望我足够描述。这个让我感到困惑,我真的想抓住这些小东西,因为我知道它会防止这样的未来错误。谢谢!

1 个答案:

答案 0 :(得分:1)

在Ruby中,您必须使用putsprint进行打印。只返回字符串不会打印它。您的经销商类打印的原因是因为您执行了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