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?
来检查是否存在methid并且Kernel.instance_method
来调用它? (https://github.com/ruby/ruby/blob/trunk/lib/delegate.rb#L85)
- = update = - 我在Ruby bugtracker https://bugs.ruby-lang.org/issues/12113
中创建了一个问题答案 0 :(得分:0)
您正在检查错误的位置。当您定义类似于instance_methods
下未显示的方法时,您并未处理内核的实例,因为该模块,但是在这里:
Kernel.methods & [ :some_func ]
# => [:some_func]
它就是。