0

我来自 Java 和一些 C++,并且正在通过创建二十一点游戏来学习(一些)红宝石。我正在仔细阅读这个程序以了解 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 - 这是因为我有一个手,里面装满了卡片(此时只有一张),并且它确实包含带有值的卡片3. 所以,我不知道我的代码有什么问题导致它返回 false - 我产生了“手”的每张卡片,我认为应该通过使用卡片的每个语句产生该值?

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

4

2 回答 2

0

它打印出您的对象,因为该Array#each方法返回对象本身。如果您只想返回Hand简单地返回数组中的卡片,或者返回连接的版本:

def to_s
  @hand.join("\n")
end
于 2013-04-08T13:06:18.347 回答
0

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

现在,如果您执行以下操作:

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

由于您没有定义to_s任何类HandCard因此Object#to_sputs. 只是为了证明它在你的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 中(即,如果任何对象 == 对象),则返回 true,否则返回 false。

这意味着在您的情况下,数组[1,2,3,4,5]包含Fixnum对象。因此Fixnum#==将被调用。如果 fix 在数字上等于 other,则Fixnum#==表示返回 true。. 但是您的类对象不满足上述条件,对于每个调用,例如,等等,因此已返回值。pHand1==p2==pfalse

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

于 2013-04-08T13:27:52.540 回答