为什么这个Ruby对象既有to_s又检查看起来做同样事情的方法?

pro*_*eek 62 ruby printing object

为什么这个Ruby对象to_sinspect看起来做同样事情的方法?

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
Run Code Online (Sandbox Code Playgroud)

我明白了

G
Graph : 0
Graph : 0
Run Code Online (Sandbox Code Playgroud)
  • 那么,为什么Ruby有两个函数做同样的事情呢?to_s和之间有什么区别inspect
  • 这有什么之间的区别puts,print以及p

如果我注释掉to_sinspect函数,我得到如下.

#<Graph:0x100124b88>
#<Graph:0x100124b88>
Run Code Online (Sandbox Code Playgroud)

Dav*_*vid 51

inspect更多用于调试和to_s最终用户或显示目的.

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

  • 我可能做错了,但在IRB中我的输出是相同的:"[1,2,3]"`.另一方面,`nil.to_s`和`nil.inspect`分别产生`""和`"nil". (46认同)
  • 使用ruby 1.8.7我得到`[1,2,3] .to_s =>"123"`.使用ruby 2.0.0,我得到`[1,2,3] .to_s =>"[1,2,3]"`.因此,根据您所讨论的版本,给定的示例要么为真,要么不为真. (25认同)
  • 同样在这里,to_s和inspect返回相同的输出(截至2013年3月) (2认同)
  • 截至今天,版本 2.6.3,我得到了两者相同的输出。 (2认同)

Mar*_*off 32

inspect默认情况下,它是一种方法,它告诉您类名,实例object_id,并列出实例的实例变量.

print并且puts,正如您所知,将其用于放置对象to_s方法的值STDOUT.如Ruby的文档所示,Object#to_s返回表示对象的字符串 - 用于最终用户可读性.

printputs除了puts自动附加换行符之外,它们彼此相同,而print不是.

  • `Time.new.inspect` 不显示 `class` 名称和 `object_id`,而是打印 `"2016-11-10 13:05:45 +0530"` (时间在 `string` 中) (2认同)

gro*_*kus 14

为了与Python相比,to_s就像是__str__inspect__repr__.to_s给你一个字符串,然后inspect给你对象的字符串表示.如果您愿意,可以使用后者构造对象.


Rob*_*obH 5

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


小智 5

对于在开始使用Ruby Koans之后到达这里的任何人,输出的位置to_sinspect差异的一个简单示例是:

nil.to_s     # will yield an empty string, ie ""
nil.inspect  # will yield the string "nil"
Run Code Online (Sandbox Code Playgroud)