繁体   English   中英

无法覆盖irb中的to_s

[英]Cannot override to_s in irb

我在pry中定义了一个函数:to_s,但是我无法调用它。 这种方法在哪里,我怎么称呼它?

pry(main)> def to_s
pry(main)*   'hello'
pry(main)* end
pry(main)> to_s
=> "main"

我的ruby版本是2.1.2

在阅读了一些答案并进行搜索之后,我想我得到了正确的答案:

  1. 这种方法在哪里?

当在irb或pry中定义方法时,它转到Object.instance_methods

[1] pry(main)> def to_s
[1] pry(main)*   'hello'
[1] pry(main)* end
=> :to_s
[2] pry(main)> def hello
[2] pry(main)*   'world'
[2] pry(main)* end
=> :hello
[4] pry(main)> Object.instance_methods(false)
=> [:pry, :__binding__, :to_s, :hello]
  1. 我怎么称呼它?

可以在新对象中调用这些新方法。

[6] pry(main)> Object.new.to_s
=> "hello"

我无法在顶层调用to_s的原因是main是一个定义了#to_s#inspect方法的特殊对象。

[5] pry(main)> singleton_class.instance_methods(false)
=> [:to_s, :inspect]

@ Anthony的答案解释了背景。 要在此级别定义您自己的to_s ,您可以这样做:

pry(main)> to_s
=> "main"
pry(main)> def self.to_s
pry(main)*   'hello'
pry(main)* end
pry(main)> to_s
=> "hello"

您实际上处于顶级Object class#to_s方法,正如文档所述:

返回表示obj的字符串。 默认的to_s打印对象的类和对象id的编码。 作为一种特殊情况,作为Ruby程序的初始执行上下文的顶级对象返回“main”。

在toplevel定义的方法成为Object private实例方法。

所以,

def to_s; 'hello' end

相当于

class Object; private def to_s; 'hello' end end

没有显式接收器的消息发送被隐式发送给self

所以,

to_s

相当于

self.to_s

在顶层, self是无名的顶级对象,通常称为main

现在,如果任何main类覆盖Object#to_s ,则将调用被覆盖的版本。 而事实上, to_s 重写的单例类的main

method(:to_s).owner
# => #<Class:#<Object:0x007fb5210c1c68>>

完成你要做的事情的另一种方法是,操作“当前”类,如下所示:

class << self
  def to_s
    "hello"
  end
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM