为什么这个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_s
和inspect
什么区别? -
puts
,print
和p
什么区别?
如果我注释掉了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 – 用于最终用户的可读性。
print
和puts
是相同的,除了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
不会。)我觉得我应该提到这一点,因为我已经被它咬了:)
一般放在一个对象上打印应用的结果,而打印对象的结果。
inspect
和to_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_s
和inspect
在输出上的区别是:
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