to_s&&包括?涉及继承的问题

时间:2013-04-08 12:56:53

标签: ruby inheritance output

我来自Java和一些C ++,并且通过创建一个二十一点游戏来学习(一些)ruby。我一丝不苟地通过这个程序来了解ruby是如何工作的。

手头的代码是:

class Card
  include Comparable
  include Enumerable
  attr_accessor :value
  def initialize(v)
    @value = v
  end
  def <=>(other)
    if other.is_a?(Card)
      @value <=> other.value
    else
      @value <=> other
    end
  end
  def each
    yield @value
  end
  def to_s
    "#{@value}"
  end
end

class Hand <  Card
  include Enumerable
  attr_accessor :hand
  def initialize
    @hand = Array.new()
  end
  def clear_hand
    @hand.clear
  end
  def add_to_hand(c)
    if c.is_a?(Card)
      @hand << c
    else
      raise "We have a problem - we received a non card object into our hand"
    end
  end
  def each
    @hand.each do |card|
      yield card
    end
  end
  def to_s
    @hand.each do |c|
      puts c
    end
  end
end

c1 = Card.new(3)
c2 = Card.new(0)
p = Hand.new()
p.add_to_hand(c1)
puts c1 # => 3
puts p  # => 3 \n(new line) #<Hand:0x00000002b01ba0>
puts [1,2,3,4,5].include?(c1)  # => true
puts [1,2,3,4,5].include?(p)   # => false

我的问题:

为什么,当我使用'puts p'时,我得到一个ObjectID以及期望值'3'。它只对数组做这个(或者我到目前为止已经注意到了,但我确定有其他情况下它也返回ObjectID)。有人可以解释一下原因吗。

最后一行(当我们得到错误输出时)我希望它返回true - 这是因为我有一只手牌,里面装满了牌(此时只有一张牌),它确实包含了这张牌因此,我不知道我的代码有什么问题导致它返回false - 我会产生“hand”的每张卡片,我认为应该通过使用卡片的每个声明来产生该值?

如果不清楚,请告诉我们! 提前谢谢。

2 个答案:

答案 0 :(得分:0)

它打印出您的对象,因为Array#each方法返回对象本身。如果您只想返回Hand中的卡片,只需返回数组或加入版本:

def to_s
  @hand.join("\n")
end

答案 1 :(得分:0)

Object#to_s说: 返回表示obj的字符串。默认to_s打印对象的类和对象id的编码。

现在,如果你这样做:

p Hand.ancestors 
#=> [Hand, Card, Enumerable, Comparable, Object, Kernel, BasicObject]

由于您未定义任何班级to_sHand Card,因此Object#to_s会调用puts。只是为了证明它将下面的代码放在Hand类中:

  def to_s
   "I am Hand class Object"
  end

现在拨打puts p,您会看到输出:I am Hand class Object

Array#to_s重载了Object#to_s。从而打印出不同的输出。

现在遇到第二个困惑:

Array#include?说 -

  

如果给定对象存在于self中(即,如果有任何object == object),则返回true,否则返回false。

在您的情况下,数组[1,2,3,4,5]包含Fixnum个对象。因此将调用Fixnum#==Fixnum#== 如果修正等于其他数字,则返回true。 。但是p您的Hand类对象不符合上述条件,对于1==p2==p等每个调用都是如此,因此false值已经返回。

希望它能帮助您理解这个概念。