为什么我不能通过覆盖.to_s或在String上初始化来改变puts"string"的输出?

Ale*_*kin -1 ruby

我已经在String类中替换了一个方法to_s,但正如我所看到的,当我运行时puts "string",ruby调用的不是to_s方法.

def add_method(cls)
  cls.class_eval do
    def initialize
      self.new('you hacked')
    end

    def to_s
      'you hacked'
    end
  end
end

add_method String

puts "zxzxzzx"
puts "zxzxzzx".to_s
Run Code Online (Sandbox Code Playgroud)

哪个输出:

>> zxzxzzx
>> you hacked
Run Code Online (Sandbox Code Playgroud)

如何替换这种隐式初始化?

Ser*_*sev 5

当我运行puts"string"时,ruby调用的不是to_s方法.

它已经是一个字符串,没有完成转换.有关更多信息,请参阅IO#puts的源代码.

而且,使用初始化程序的尝试技巧也不起作用.返回值initialize被忽略.它只能用于在已创建的对象上设置属性,它不能替换该对象.