2013-04-08 247 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的值已被返回。

希望它能幫助你理解這個概念。