Ruby 委派人.在类/模块外部定义的调用方法:名称错误



我对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]

就是这样。

最新更新