我有Delegator
果然与Kernel.respond_to?
或Kernel.instance_method
Ruby代理。定义调用方法类/模块外:NameError
def some_func
puts '12'
end
puts ::Kernel.respond_to?(:some_func, true) #=> true
::Kernel.instance_method(:some_func) #=> `instance_method': undefined method `some_func' for module `Kernel' (NameError)
一个问题,原来在这种情况下发现了一个问题:
def some_func
puts '12'
end
class Klass < Delegator
def initialize(obj)
@obj = obj
end
def __getobj__
@obj
end
def func
some_funC#=> `instance_method': undefined method `some_func' for module `Kernel' (NameError)
end
end
Klass.new(0).func
我猜Kernel.respond_to?(:some_func)
是真的,因为我们的确可以称之为Kernel
。并且instance_method
尝试采用在Kernel
本身定义的方法(这不是这种情况)。
但我想知道为什么Delegator
使用Kernel.respond_to?
来检查方法是否存在,Kernel.instance_method
来调用它? (https://github.com/ruby/ruby/blob/trunk/lib/delegate.rb#L85)
- = =更新 - 我创建了一个Ruby的错误追踪系统里的问题https://bugs.ruby-lang.org/issues/12113
该代码在Ruby 2.3.0中为我生成了正确的结果。 – tadman
那么你复制粘贴这段代码并且没有错误地运行它?这很奇怪。你在使用什么操作系统? –
对于像这样简单的代码,OS几乎不是一个因素。你在使用Ruby 2还是更好? – tadman