首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只在重写Kernel.puts之后才能覆盖名称空间puts?

只在重写Kernel.puts之后才能覆盖名称空间puts?
EN

Stack Overflow用户
提问于 2012-12-31 22:40:00
回答 2查看 424关注 0票数 0

很抱歉出现了一个模糊的问题标题,但我不知道是什么原因造成了以下情况:

代码语言:javascript
复制
module Capistrano
  class Configuration
    def puts string
      ::Kernel.puts 'test'
    end
  end
end

现在,当Capistrano调用puts时,我没有看到"test",但我看到了原始输出。

但是,当我添加以下内容时:

代码语言:javascript
复制
module Kernel
  def puts string
    ::Kernel.puts 'what gives?'
  end
end

现在,突然间,puts实际上返回了"test",而不是“给出了什么?”,不是原始内容,而是“测试”。

除了我对Ruby内核内部工作的理解有限之外,是否有合理的解释来解释这种情况呢?

在我看来(但不知何故“似乎有用”)的事情:

  • 我希望第一个街区能返回“测试”,但它没有
  • 我希望这两个街区的组合能返回“什么给出了什么?”,但它会返回“测试”?
  • 我重写Kernel.puts的方式对我来说似乎是一个永无止境的循环?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-01 00:25:53

代码语言:javascript
复制
module Capistrano
  class Configuration
    def puts string
      ::Kernel.puts 'test'
    end
    def an_thing
      puts "foo"
    end
  end
end

Capistrano::Configuration.new.an_thing

给出输出:

代码语言:javascript
复制
test

第二个版本也提供了相同的输出。原因是您定义的是实例级方法,而不是类级方法(这个职位似乎很好地解释了这些差异)。略有不同的版本:

代码语言:javascript
复制
module Kernel
  def self.puts string
    ::Kernel.puts 'what gives?'
  end
end

做下面的事。因为它正在导致无限递归,正如您所预期的那样。

代码语言:javascript
复制
/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
票数 0
EN

Stack Overflow用户

发布于 2013-01-01 00:52:39

我使用答案而不是评论,因为它的编辑能力。您可以编辑它以添加更多的信息,我稍后可能会删除它。

现在,当Capistrano调用but时,我没有看到"test",但是我看到了原始的输出。

在回答你的问题时,很难不了解卡皮斯特拉诺是如何称呼puts的,以及是哪一个。我会说,如果puts使用原始的Kernel#puts显示它的参数是正常的(不清楚您称之为原始输出,我必须假设您是指给予puts的字符串)。

  • 我希望第一个街区能返回“测试”,但它没有

我看到调用在Capistrano模块中的类配置中定义的实例方法puts的唯一方法是:

代码语言:javascript
复制
Capistrano::Configuration.new.puts 'xxx'

代码语言:javascript
复制
my_inst_var = Capistrano::Configuration.new

在别的地方

代码语言:javascript
复制
my_inst_var.puts 'xxx'

当然它会打印test。同样,如果没有看到结果令你惊讶的puts语句,就不可能知道到底发生了什么。

  • 我希望这两个街区的组合能返回“什么给出了什么?”,但它会返回“测试”?

第二点是神秘的,我需要看到调用puts的代码以及控制台输出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14106581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档