为什么这个Ruby对象同时具有to_s和inspect方法,它们似乎在做同样的事情?

为什么这个Ruby对象同时使用to_sinspect这两个方法似乎都做同样的事情?

to_s方法调用inspect,并放置/打印调用p以表示对象。

如果我跑步

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有两个函数做同样的事情? to_sinspect有什么区别?
  • to_sinspectp和有什么区别?

如果我注释掉to_sinspect函数,则会得到如下结果。

#<Graph:0x100124b88>
#<Graph:0x100124b88>
prosseek asked 2019-10-08T11:22:32Z
9个解决方案
49 votes

[1,2,3].to_s用于调试和[1,2,3].inspect用于最终用户或显示。

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

David answered 2019-10-08T11:22:51Z
31 votes

print是一种默认情况下告诉您类名称,实例的puts并列出实例的实例变量的方法。

众所周知,使用printputs将对象的puts方法的值放入print。如Ruby的文档所述,print返回表示对象的字符串-用于最终用户的可读性。

printputs彼此相同,除了puts自动附加换行符,而print不会。

Mark Rushakoff answered 2019-10-08T11:23:33Z
13 votes

与Python进行比较,to_s就像__str__,而inspect就像__repr__to_s给您一个字符串,而inspect给您一个对象的字符串表示。 如果需要,可以使用后者构造一个对象。

grokus answered 2019-10-08T11:24:00Z
5 votes

此外,某些对象上还有一个to_str方法,当您需要类似字符串的对象而不仅仅是字符串表示形式时,将调用该方法。 (在IRB中尝试:[1,2,3].to_str,它会失败,但[1,2,3].to_s不会。)我觉得我应该提一下,因为我之前被它咬过了:)

RobH answered 2019-10-08T11:24:29Z
4 votes

对于从Ruby Koans开始后到达这里的任何人,一个简单的示例就是to_sinspect输出不同的地方是这样的:

nil.to_s     # will yield an empty string, ie ""
nil.inspect  # will yield the string "nil"
Greg Matthew Crossley answered 2019-10-08T11:25:00Z
3 votes

puts通常打印在对象上应用to_s的结果,而to_s打印在对象上应用inspect的结果。

to_sto_s之间有微妙的区别:

  • to_s当应用于对象时,返回对象十六进制代码连同实例变量
  • to_s(应用于对象)仅返回对象的十六进制代码

    类项目  def initialize(abc)   @ abc = abc  结束结束x = Item.new(22)放置x #prints对象x十六进制代码将x.inspect #prints对象x十六进制代码放入实例变量@abc将x.to_s #prints对象x十六进制代码放入p x#使用立即变量@abc打印对象x十六进制代码p x.inspect#使用即时变量@abc打印对象x十六进制代码p x.to_s#打印对象x十六进制代码
pintua answered 2019-10-08T11:26:00Z
1 votes
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教程

Feuda answered 2019-10-08T11:26:30Z
1 votes

克里斯·派恩(Chris Pine)的《学习编程》一书的答案

“检查方法与to_s非常相似,除了它返回的字符串试图向您显示用于构建传递给它的对象的红宝石代码。”

因此,inspect方法将返回一个数组,例如:

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

看跌期权/ to_s将返回的位置

25
16
9
4
1
0
codebreeze answered 2019-10-08T11:27:21Z
0 votes

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

Gitanjali answered 2019-10-08T11:27:52Z
translate from https://stackoverflow.com:/questions/2625667/why-do-this-ruby-object-have-both-to-s-and-inspect-methods-that-appear-to-do-the