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

时间:2010-04-12 21:41:07

标签: ruby object printing

为什么这个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

我得到了

G
Graph : 0
Graph : 0
  • 那么,为什么Ruby有两个函数做同样的事情? to_sinspect之间有什么区别?
  • putsprintp之间有什么区别?

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

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

9 个答案:

答案 0 :(得分:49)

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

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

答案 1 :(得分:32)

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

如您所知,

printputs用于将对象的to_s方法的值设置为STDOUT。正如Ruby的文档所示,Object#to_s返回一个表示对象的字符串 - 用于最终用户的可读性。

printputs彼此相同,但puts会自动附加换行符,而print则不会。{/ p>

答案 2 :(得分:13)

要与Python进行比较,to_s__str__类似,inspect__repr__类似。 to_s为您提供了一个字符串,而inspect为您提供了该对象的字符串表示形式。如果愿意,可以使用后者构造一个对象。

答案 3 :(得分:5)

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

答案 4 :(得分:4)

对于开始使用Ruby Koans后到达此处的所有人,to_sinspect输出不同的简单示例如下:

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

答案 5 :(得分:3)

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

inspectto_s之间存在细微差别:

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

    class Item
     def initialize(abc)
      @abc=abc
     end
    end
    
    x= Item.new(22)
    
    puts x         #prints object x hex code  
    puts x.inspect #prints object x hex code WITH INSTANCE VARIABLE @abc 
    puts x.to_s    #prints object x hex code
    
    p x            #prints object x hex code WITH INSTANCE VARIABLE @abc
    p x.inspect    #prints object x hex code WITH INSTANCE VARIABLE @abc
    p x.to_s       #prints object x hex code

答案 6 :(得分:1)

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

答案 7 :(得分:1)

来自Chris Pine的学习计划书的回答

“inspect方法与to_s很相似,不同之处在于它返回的字符串会尝试显示用于构建传递对象的ruby代码。”

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

import React from 'react';

import { Drivers } from '../api/drivers';

export default class Riders extends React.Component {
  renderNames() {
    return this.props.riders.join(' - ');
  }
  render() {
    return (
      <div>
        <p>{this.renderNames()}</p>
      </div>
    );
  }
}

puts / to_s将返回的位置

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

答案 8 :(得分:0)

请参阅以下链接以获取更多信息和示例,说明&#34; to_s&#34;和&#34;检查&#34;以及&#34; puts&#34;之间的区别和&#34; p&#34;。 https://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/45-more-classes/lessons/108-displaying-objects