【问题标题】:Why do this Ruby object have both to_s and inspect methods that appear to do the same thing?为什么这个 Ruby 对象同时具有 to_s 和 inspect 似乎做同样事情的方法?
【发布时间】:2011-02-07 05:08:30
【问题描述】:

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

p 方法调用 inspect 和 puts/print 调用 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 有两个函数做同样的事情呢? to_sinspect 有什么区别?
  • putsprintp 之间有什么区别?

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

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

【问题讨论】:

    标签: ruby object printing


    【解决方案1】:

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

    printputs 用于将对象的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】:

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

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

    【讨论】:

    • 我可能做错了什么,但在 IRB 中对我来说输出是相同的:"[1, 2, 3]"。另一方面,nil.to_snil.inspect 分别产生了 """nil"
    • 这里相同,to_s 和检查返回相同的输出(截至 2013 年 3 月)
    • [1,2,3].to_s =&gt; "123"; [1,2,3].inspect =&gt; "[1, 2, 3]""#{...}" 使用前者; p ... 使用后者。
    • 使用 ruby​​ 1.8.7 我得到[1,2,3].to_s =&gt; "123"。使用 ruby​​ 2.0.0 我得到[1,2,3].to_s =&gt; "[1, 2, 3]"。因此,给定的示例是正确的还是错误的,具体取决于您所谈论的版本。
    • 截至今天,版本 2.6.3,我得到了相同的输出。
    【解决方案3】:

    与 Python 相比,to_s 类似于 __str__inspect 类似于 __repr__to_s 给你一个字符串,而inspect 给你对象的字符串表示。如果你愿意,你可以使用后者来构造一个对象。

    【讨论】:

    • 但在 Python 中 eval(repr(z)) == z 应该是 True:你如何在 Ruby 中实现这一点?
    • eval(repr(z)) == z 是一个神话。这很少是有用的事情,并且有很多潜在的问题。这篇文章是一个好的开始:stupidpythonideas.blogspot.com.au/2013/11/…
    • Alex Martelli 在这里表达了同样的观点:stackoverflow.com/a/1436756/665488。让您的__repr__s 保持这样的工作太难了,几乎没有真正的实际优势。
    【解决方案4】:

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

    【讨论】:

    • 不确定你对类似字符串的对象是什么意思,但据我了解,to_s 用于字符串表示,因此用于插值,而to_str 用于隐式转换,例如类型强制。
    【解决方案5】:
    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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        inspectto_s 之间存在细微差别:

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

          类项目
           定义初始化(abc)
            @abc=abc
           结尾
          结尾
          
          x=Item.new(22)
          
          puts x #prints 对象 x 十六进制代码
          puts x.inspect #prints object x hex code WITH INSTANCE VARIABLE @abc
          puts x.to_s #prints 对象 x 十六进制代码
          
          p x #prints 对象 x 十六进制代码,带有实例变量 @abc
          p x.inspect #prints object x hex code WITH INSTANCE VARIABLE @abc
          p x.to_s #打印对象 x 十六进制代码

        【讨论】:

          【解决方案8】:

          对于从 Ruby Koans 开始后到达这里的任何人,to_sinspect 输出不同的简单示例如下:

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

          【讨论】:

            【解决方案9】:

            Chris Pine 的《学习编程》一书中的答案

            “inspect 方法很像 to_s,只是它返回的字符串会尝试向您显示用于构建您传递给它的对象的 ruby​​ 代码。”

            因此,inspect 方法将返回一个数组,例如这样...

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

            puts / to_s 将返回的位置

            25
            16
            9
            4
            1
            0
            

            【讨论】:

              猜你喜欢
              • 2010-12-20
              • 1970-01-01
              • 1970-01-01
              • 2015-12-14
              • 1970-01-01
              • 2014-06-16
              • 2023-04-06
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多