Ruby 重写命名空间puts仅在重写Kernel.puts后有效?
很抱歉,问题标题含糊不清,但我不知道是什么原因导致以下情况:Ruby 重写命名空间puts仅在重写Kernel.puts后有效?,ruby,overriding,puts,Ruby,Overriding,Puts,很抱歉,问题标题含糊不清,但我不知道是什么原因导致以下情况: module Capistrano class Configuration def puts string ::Kernel.puts 'test' end end end 现在,当Capistrano调用put时,我没有看到“test”,但看到了原始输出 但是,当我还添加以下内容时: module Kernel def puts string ::Kernel.puts 'what
module Capistrano
class Configuration
def puts string
::Kernel.puts 'test'
end
end
end
现在,当Capistrano调用put
时,我没有看到“test”,但看到了原始输出
但是,当我还添加以下内容时:
module Kernel
def puts string
::Kernel.puts 'what gives?'
end
end
现在,突然,put
实际返回的是“test”,而不是“what gives?”,不是原始内容,而是“test”
有没有一个合理的解释来解释为什么会发生这种情况(除了我对Ruby内核内部工作的有限理解)
让我觉得不舒服的事情(但不知何故“似乎有效”):
- 我希望第一个块返回“test”,但它没有返回
- 我希望两个块的组合返回'what gives',但它返回'test'
- 我重写Kernel.put的方式对我来说似乎是一个永无止境的循环
test
第二个版本也给出了相同的输出。原因是您定义的是实例级方法而不是类级方法(似乎在解释差异方面做得很好)。稍有不同的版本:
module Kernel
def self.puts string
::Kernel.puts 'what gives?'
end
end
执行以下操作。因为它会导致无限递归,正如您所期望的那样
/tmp/foo.rb:14:in `puts': stack level too deep (SystemStackError)
from /tmp/foo.rb:14:in `puts'
from /tmp/foo.rb:4:in `puts'
from /tmp/foo.rb:7:in `an_thing'
from /tmp/foo.rb:18
shell returned 1
我使用答案而不是评论,因为它具有编辑功能。你可以编辑它来添加更多信息,我以后可能会删除它 现在,当Capistrano调用puts时,我看不到“测试”,但我看到了 原始输出 如果不了解Capistrano如何调用
put
以及使用哪种方法,就很难回答您的问题。我想说,如果puts使用原始的内核#puts
显示其参数是正常的(不清楚您称之为原始输出的内容,我必须假设您指的是给定给puts的字符串)
- 我希望第一个块返回“test”,但它没有返回
put
的唯一方法是:
Capistrano::Configuration.new.puts 'xxx'
或
还有别的地方
my_inst_var.puts 'xxx'
当然,它会打印测试。同样,如果没有看到结果令你惊讶的看跌期权声明,就不可能知道发生了什么
- 我希望两个块的组合返回'what gives',但它返回'test'
第二点很神秘,我需要查看代码调用put以及控制台输出
my_inst_var = Capistrano::Configuration.new
my_inst_var.puts 'xxx'