很抱歉出现了一个模糊的问题标题,但我不知道是什么原因造成了以下情况:
module Capistrano
class Configuration
def puts string
::Kernel.puts 'test'
end
end
end现在,当Capistrano调用puts时,我没有看到"test",但我看到了原始输出。
但是,当我添加以下内容时:
module Kernel
def puts string
::Kernel.puts 'what gives?'
end
end现在,突然间,puts实际上返回了"test",而不是“给出了什么?”,不是原始内容,而是“测试”。
除了我对Ruby内核内部工作的理解有限之外,是否有合理的解释来解释这种情况呢?
在我看来(但不知何故“似乎有用”)的事情:
发布于 2013-01-01 00:25:53
module Capistrano
class Configuration
def puts string
::Kernel.puts 'test'
end
def an_thing
puts "foo"
end
end
end
Capistrano::Configuration.new.an_thing给出输出:
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发布于 2013-01-01 00:52:39
我使用答案而不是评论,因为它的编辑能力。您可以编辑它以添加更多的信息,我稍后可能会删除它。
现在,当Capistrano调用but时,我没有看到"test",但是我看到了原始的输出。
在回答你的问题时,很难不了解卡皮斯特拉诺是如何称呼puts的,以及是哪一个。我会说,如果puts使用原始的Kernel#puts显示它的参数是正常的(不清楚您称之为原始输出,我必须假设您是指给予puts的字符串)。
我看到调用在Capistrano模块中的类配置中定义的实例方法puts的唯一方法是:
Capistrano::Configuration.new.puts 'xxx'或
my_inst_var = Capistrano::Configuration.new在别的地方
my_inst_var.puts 'xxx'当然它会打印test。同样,如果没有看到结果令你惊讶的puts语句,就不可能知道到底发生了什么。
第二点是神秘的,我需要看到调用puts的代码以及控制台输出。
https://stackoverflow.com/questions/14106581
复制相似问题