无法覆盖irb中的to_s

she*_*fly 5 ruby

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

pry(main)> def to_s
pry(main)*   'hello'
pry(main)* end
pry(main)> to_s
=> "main"
Run Code Online (Sandbox Code Playgroud)

我的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]
Run Code Online (Sandbox Code Playgroud)
  1. 我怎么称呼它?

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

[6] pry(main)> Object.new.to_s
=> "hello"
Run Code Online (Sandbox Code Playgroud)

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

[5] pry(main)> singleton_class.instance_methods(false)
=> [:to_s, :inspect]
Run Code Online (Sandbox Code Playgroud)

Ant*_*ony 3

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

\n\n
\n

返回表示 obj 的字符串。默认 to_s 打印\n object\xe2\x80\x99s 类和对象 id 的编码。作为一种特殊情况,作为 Ruby 程序的初始执行上下文的顶级对象返回 \xe2\x80\x9cmain\xe2\x80\x9d。

\n
\n