2011-09-27 42 views
1

感謝您檢查此問題。這是我的第一個問題,所以任何幫助/批評都表示讚賞。我正在通過Ruby的免費在線版本(Pragmatic Programmer's Guide,version 1)工作。以下示例沒有(當我這樣做時)本書所說的應該是:Range.to_a在「Programming Ruby」中的示例

class VU 


    include Comparable 


    attr :volume 


    def initialize(volume) # 0..9 
    @volume = volume 
    end 


    def inspect 
    '#' * @volume 
    end 


    # Support for ranges 


    def <=>(other) 
    self.volume <=> other.volume 
    end 


    def succ 
    raise(IndexError, "Volume too big") if @volume >= 9 
    VU.new(@volume.succ) 
    end 
end 

應做到以下幾點,根據書,IRB:

medium = VU.new(4)..VU.new(7) 
medium.to_a  » [####, #####, ######, #######] 
medium.include?(VU.new(3)) » false 

但到底是什麼發生了我與VU的數組medium.to_a返回一個對象,像這樣:

#<VU:0x9648918>                
#<VU:0x96488b4>                
#<VU:0x964888c>                
#<VU:0x9648878> 

這對我來說很合理(我認爲)。對我來說沒有意義的是本書的斷言,即應該返回的是一系列'#'。那不是我們需要調用檢查方法,以便讓那些「#的?

謝謝! 伊恩

回答

0

這是你在IRB看?inspect被隱式調用在IRB返回值。你該數組充滿VU對象,但什麼應顯示爲inspect這些對象的輸出是否正確。

> x = VU.new(5) 
=> ##### 
> x.class 
=> VU 
> x.succ 
=> ###### 
+0

謝謝您的幫助。我撒謊了,這不是在IRB後所有我說,因爲我相信在irb和beh中運行它的行爲在解釋器中運行它作爲.rb腳本的avior(當時我解釋的單詞解釋器,所以我只是說irb)會是一樣的。我現在看到它的真相,我會在未來嘗試更具體。再次感謝。 – eeeeeean