Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 重写命名空间puts仅在重写Kernel.puts后有效?_Ruby_Overriding_Puts - Fatal编程技术网

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”,但它没有返回
调用在模块Capistrano的类配置中定义的实例方法
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'