2012-07-19 49 views
1

我正在處理一個數組,我們將其稱爲books,其中的複雜對象稱爲Book。問題是當我打電話給puts "#{books.inspect}"時,ruby輸出一串二進制(不可讀的utf8字符)。但是,當我撥打puts #{books[0].to_str}"時,我得到一個簡短而漂亮的輸出,描述了book。不知道是否是相關的,但Book是一個子類(我們可以調用它的父類Item)和books.length=1ruby​​ Array.inspect與Array [元素] .to_s

Ruby意味着.to_s.inspect是同義的,但他們顯然在實踐中提供了不同的結果。有誰知道爲什麼會發生這種情況,你能否提供一個關於如何從整個書籍集合中獲得我想要的好輸出的建議?

其它信息:

[chk ~ ]$ ruby -v 
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux] 
+0

無論代碼返回結果如何,'#{code}'自動調用'to_s'。 '#{books [0] .to_s}'=='#{books [0]}''。 'puts'做同樣的事情。所以,'放書[0]'=='放置「#{books [0] .to_s}」' – 2012-07-19 19:21:11

回答

2
class Myclass 
    def to_s 
     'my string representation' 
    end 
    def inspect 
     'my inspection' 
    end 
end 
a= [Myclass.new] 
p a 
puts a 

outputs :: 
[my inspection] 
my string representation 

的檢查方法被稱爲用於陣列內的每個元件。如果該方法未定義,則獲取默認的類表示形式。您只需要定義inspect

你總是可以只是做:

def inspect 
    self.to_s 
end 
0

books.inspectbooks[0].to_s是絕對不一樣的。 第一個是調用inspect方法的book對象,它是一個數組。第二個是調用to_s方法的books[0]對象,不管它是否包含在數組中。 由於您沒有具體說明books[0]究竟是什麼,恐怕我無法再說更多了。

+0

井書[0]是一本書,其中我既沒有定義'.inspect'也沒有定義''。 to_s'方法。它的父類'Item'具有'.inspect'方法,但不是'.to_s'方法。所以我想我仍然不明白爲什麼'.inspect'失敗,但'.to_s'工作..? – CHK 2012-07-19 20:44:44