Ruby委托人。在类/模块外定义的调用方法:NameError

时间:2016-02-25 19:53:19

标签: 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?来检查是否存在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

中创建了一个问题

1 个答案:

答案 0 :(得分:0)

您正在检查错误的位置。当您定义类似于instance_methods下未显示的方法时,您并未处理内核的实例,因为该模块,但是在这里:

Kernel.methods & [ :some_func ]
# => [:some_func]

它就是。