Ruby中的Object.class和Object.class.inspect有什么区别?

时间:2017-05-10 00:05:48

标签: ruby class oop

似乎这两种方法都返回相同的结果(对象的人类可读表示及其类型)。方法之间有什么区别?

class Foo

end

f = Foo.new
puts f.class          <==  puts Foo
puts f.class.inspect  <==  puts Foo

2 个答案:

答案 0 :(得分:4)

  

似乎这两种方法都返回相同的结果(对象及其类型的人类可读表示)。

不,他们不会。

  

方法之间有什么区别?

Object#class返回接收者的类。

Module#inspectModule#to_s的别名,并返回模块的人类可读字符串表示形式。特别是,如果有Module#name,则返回Class,否则返回唯一的表示。对于单例类,它包含有关单例类是单例类的对象的信息。

因此,这两种方法不会返回相同的结果。事实上,他们甚至不会返回同一个类的结果:Object#class返回String类的实例,Module#inspect返回RequestSenderToken的实例类。

答案 1 :(得分:0)

由于puts需要字符串,因此它会调用类的to_s方法。我相信Class继承了method from Module

  

返回表示此模块或类的字符串。对于基本类和模块,这是名称。对于单身人士,我们也会显示有关我们所附信息的信息。

     

也别名为:inspect

也许您打算查看对象的方法?

class Foo
  def initialize
    @t = 'Junk'
  end
end

f = Foo.new
puts f.class    # =>  Foo
puts f.to_s     # =>  #<Foo:0x007fce2503bbf0>
puts f.inspect  # =>  #<Foo:0x007fce2503bbf0 @t="Junk">