为什么这个Ruby对象同时拥有to_s和检查似乎做同样事情的方法?

为什么这个Ruby对象都是to_s方法和inspect方法似乎是做同样的事情呢?

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 
  • 那么,为什么Ruby有两个function做同样的事情呢? to_sinspect什么区别?
  • putsprintp什么区别?

如果我注释掉了to_s或者inspect函数,我得到如下的结果。

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

inspect更多地用于debugging, to_s用于最终用户或显示目的。

例如, [1,2,3].to_s[1,2,3].inspect产生不同的输出。

inspect是一种方法,默认情况下会告诉您类名称,实例的object_id ,并列出实例的实例variables。

如你所知,使用print和put将对象的to_s方法的值to_s STDOUT 。 如Ruby的文档所示, Object#to_s返回一个表示对象的string – 用于最终用户的可读性。

printputs是相同的,除了puts自动附加新行,而print不。

为了与Python进行比较, to_s就像__str__inspect就像__repr__to_s给你一个string,而inspect给你这个对象的string表示。 如果你愿意,你可以使用后者来构造一个对象。

而且,在某些对象上有一个to_str方法,当你需要一个String类对象时,你可以调用它,而不仅仅是一个string表示。 (尝试在IRB: [1,2,3].to_str ,它会失败,但[1,2,3].to_s不会。)我觉得我应该提到这一点,因为我已经被它咬了:)

一般放在一个对象上打印应用的结果,而打印对象的结果。

inspectto_s有一个微妙的区别:

  • 当应用于对象时, inspect对象hex代码以及实例variables
  • to_s在应用于对象时只返回对象hex代码

     类项目
     初始化(abc)
       @ ABC = ABC
     结束
    结束
    
     x = Item.new(22)
    
    将x#打印对象xhex代码  
    放x.inspect #prints对象xhex代码WITH INSTANCE VARIABLE @abc 
    将x.to_s #prints对象xhex代码放入
    
     px #prints对象xhex代码WITH INSTANCE VARIABLE @abc
     p x.inspect #prints对象xhex代码WITH INSTANCE VARIABLE @abc
     p x.to_s#打印对象xhex代码 
 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教程

对于从Ruby Koans出发之后到达这里的任何人来说 ,一个简单的例子就是: to_sinspect在输出上的区别是:

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

从Chris Pine的“学习计划”书中回答

“检查方法很像to_s,除了它返回的string试图向你展示构build你通过它的对象的ruby代码。

因此,检查方法将返回一个数组,例如像这样…

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

在哪里/ to_s将返回

 25 16 9 4 1 0 

请参阅以下链接以获取更多信息和示例,解释“to_s”和“inspect”之间的区别以及“puts”和“p”之间的区别。 https://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/45-more-classes/lessons/108-displaying-objects