2013-04-08 264 views
0

我来自Java和一些C++,并通过创建二十一点游戏来学习(一些)红宝石。我非常认真地通过这个程序来了解ruby是如何工作的。to_s &&包含?涉及继承的问题

手头的代码是:

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 

我的问题:

为什么,当我使用“放P”我得到一个对象ID与预期值“3'.It只做沿这与数组(或者这是我迄今注意到的所有,但我相信有其他情况下,它也返回ObjectID)。有人可以解释为什么。

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

如果这不清楚,请让我知道! 在此先感谢。

回答

0

它打印出你的对象,因为Array#each方法返回对象本身。如果你想在Hand只返回卡简单地返回数组代替,或加入版本:

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

你刚才说过我忘了在我手上的课上做<==>吗?或者是在别的地方还是我做的?谢谢! – user2243357 2013-04-08 19:06:27

+0

@ user2243357不,你没有补足,我删除了那部分,因为它不正确。 – 2013-04-09 12:31:38

0

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

,如果你做如下:

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

当你不定义任何to_sHand类和Card,从而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?说 -

返回true,如果给定对象存在于自我(也就是说,如果任何对象==对象),否则返回假。

这意味着在你的情况下,数组[1,2,3,4,5]包含Fixnum对象。因此将调用Fixnum#==Fixnum#==表示如果修正等于其他数字,则返回true。。但p你的Hand类对象不符合该条件,对于每个呼叫如1==p,2==p等,因此false的值已被返回。

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