2010-04-12 31 views
53

爲什麼這個Ruby對象似乎做同樣的事情的to_sinspect方法?爲什麼這個Ruby對象同時擁有to_s和檢查似乎做同樣事情的方法?

p方法調用inspect和放置/打印調用to_s代表對象。

如果我運行

class Graph 
    def initialize 
    @nodeArray = Array.new 
    @wireArray = Array.new 
    end 
    def to_s # called with print/puts 
    "Graph : #{@nodeArray.size}" 
    end 
    def inspect # called with p 
    "G" 
    end 
end 

if __FILE__ == $0 
    gr = Graph.new 
    p gr 
    print gr 
    puts gr 
end 

我得到

G 
Graph : 0 
Graph : 0 
  • 那麼,爲什麼紅寶石有兩個功能做同樣的事情? to_sinspect有何區別?
  • puts,printp有什麼區別?

如果我註釋掉to_sinspect函數,我會得到如下結果。

#<Graph:0x100124b88> 
#<Graph:0x100124b88> 

回答

43

inspect用於更多的調試和to_s爲最終用戶或顯示目的。

例如,[1,2,3].to_s[1,2,3].inspect會產生不同的輸出。

+39

我可能做錯了什麼,但對我來說在IRB中輸出是一樣的:''[1,2,3]''。另一方面,'nil.to_s'和'nil.inspect'分別產生''''''和'「nil」'。 – BreakPhreak 2011-06-02 11:39:01

+2

同樣在這裏,to_s和檢查返回相同的輸出(截至2013年3月) – aug2uag 2013-03-10 05:35:56

+1

'[1,2,3] .to_s =>「123」'; '[1,2,3] .inspect =>「[1,2,3]」'。 ''#{...}「'使用前者; 'p ...'使用後者。 – cdunn2001 2013-05-12 21:07:29

29

inspect是一個方法,默認情況下,告訴你的類名,實例的object_id,並列出關閉實例的實例變量。

printputs被使用,因爲你已經知道,該對象的to_s方法的價值投入STDOUT。正如Ruby的文檔所示,Object#to_s返回一個表示對象的字符串 - 用於最終用戶的可讀性。

printputs彼此完全相同,只是puts會自動附加換行符,而print不會。

+1

'Time.new.inspect'沒有顯示'class' name和'object_id',它相當於打印''2016-11-10 13:05:45 +0530「'(Time in'string') – 2016-11-10 07:36:12

13

與Python進行比較,to_s就像__str__inspect就像__repr__to_s爲您提供了字符串,而inspect爲您提供了對象的字符串表示形式。如果你願意,你可以使用後者構造一個對象。

+0

但在Python'eval(repr(z))== z'應該是真的:你如何在Ruby中實現這一點? – wchargin 2013-12-26 19:56:48

+1

'eval(repr(z))== z'是一個神話。這是非常有用的事情,並且有很多潛在的問題。這篇文章是一個好的開始:http://stupidpythonideas.blogspot.com.au/2013/11/repr-eval-bad-idea.html – 2014-04-29 02:19:03

+0

Alex Martelli在這裏表達了同樣的觀點:http://stackoverflow.com/a /665488分之1436756。要保持你的'__repr__'這樣工作是非常困難的,因爲很少有真正的實際優勢。 – 2014-04-29 02:25:18

5

此外,在某些對象上有一個to_str方法,您需要類似String的對象時調用該方法,而不僅僅是字符串表示。 (嘗試在IRB:[1,2,3].to_str,它會失敗,但[1,2,3].to_s不會。)我覺得我應該提到這一點,因爲我已經被它之前:)

+1

不知道你對字符串類型的對象意味着什麼,但據我所知,'to_s'是用於字符串表示的,因此用於插值,而'to_str'用於隱式轉換,如類型轉換。 – 2017-06-07 19:05:44

1
2.0.0p195 :075 > puts (1..5).to_a     # Put an array as a string. 
1 
2 
3 
4 
5 
=> nil 
2.0.0p195 :076 > puts (1..5).to_a.inspect   # Put a literal array. 
[1, 2, 3, 4, 5] 
=> nil 
2.0.0p195 :077 > puts :name, :name.inspect 
name 
:name 
=> nil 
2.0.0p195 :078 > puts "It worked!", "It worked!".inspect  
It worked! 
"It worked!" 
=> nil 
2.0.0p195 :079 > p :name       # Same as 'puts :name.inspect' 
:name 
=> :name 

被咬傷從Rails Tutorial

3

puts通常打印在物體上施加to_s的結果,而p打印的inspect荷蘭國際集團的對象的結果。

inspectto_s之間的細微差別:

  • inspect,當一個對象上時,與該實例變量
  • to_s,當在物體上施加沿着返回對象的十六進制代碼 ,僅返回對象十六進制代碼

    class Item 
    def initialize(abc) 
        @abc=abc 
    end 
    end 
    
    x= Item.new(22) 
    
    puts x   #prints object x hex code 
    puts x.inspect #prints object x hex code WITH INSTANCE VARIABLE @abc 
    puts x.to_s #prints object x hex code 
    
    p x   #prints object x hex code WITH INSTANCE VARIABLE @abc 
    p x.inspect #prints object x hex code WITH INSTANCE VARIABLE @abc 
    p x.to_s  #prints object x hex code
2

對於任何有Ruby Koans,這裏to_sinspect輸出不同的一個簡單的例子起步後抵達這裏是這樣的:

nil.to_s  # will yield an empty string, ie "" 
nil.inspect # will yield the string "nil" 
1

回答克里斯·派恩的學習編程的書

「的檢查方法和to_s非常相似,只不過它返回的字符串試圖向你展示構建你傳遞的對象的ruby代碼。「

因此,該檢查方法將返回的數組例如像這樣...

[25, 16, 9, 4, 1, 0] 

凡爲賣出期權/ to_s將返回

25 
16 
9 
4 
1 
0 
相關問題