我对Delegator
有问题,结果证明是Kernel.respond_to?
或Kernel.instance_method
的问题
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
你检查错了地方。当你定义这样的方法时,它不会出现在 instance_methods
下,你不是在处理内核的实例,因为它是一个模块,而是在这里:
Kernel.methods & [ :some_func ]
# => [:some_func]
就是这样。