Ruby delegator。在类/模块外部定义的调用方法:NameError
我对Ruby delegator。在类/模块外部定义的调用方法:NameError,ruby,Ruby,我对Delegator有问题,这是内核的问题。对或内核进行响应。实例方法 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) 最
Delegator
有问题,这是内核的问题。对或内核进行响应。实例方法
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
def一些函数
把‘12’
结束
类Klass<委托人
def初始化(obj)
@obj=obj
结束
def__getobj__
@obj
结束
def func
some_func#=>`instance_method':模块'Kernel'的未定义方法'some_func'(NameError)
结束
结束
Klass.new(0.func)
我猜Kernel.response\u to?(:some\u func)
是正确的,因为我们确实可以在Kernel
上调用它。而instance\u方法
尝试采用在内核
本身上定义的方法(本例中不是这样)
但是我想知道为什么Delegator
使用Kernel.response\u to?
检查methid是否存在,并使用Kernel.instance\u方法调用它?()
-=更新=-
我在Ruby bugtracker中创建了一个问题,您检查的位置不对。当您定义这样的方法时,它不会显示在实例\u方法
下,您不是在处理内核实例,因为它是一个模块,而是在这里:
Kernel.methods & [ :some_func ]
# => [:some_func]
就是这样。这段代码在Ruby 2.3.0中为我生成了正确的结果。那么您复制粘贴了这段代码并运行它而没有错误?真奇怪。你用的是什么操作系统?操作系统从来都不是像这样简单代码的一个因素。您使用的是Ruby 2还是更高版本?方法
用于获取有关特定方法的更多信息,如Kernel.method(:some_func).source_location
,但在这种情况下也可以使用。是的,我知道它的用途。OP问为什么Kernel.instance\u方法(:some\u func)
不起作用,你的答案解释了这一点,但我想指出,在这种情况下,与instance\u方法
等效的方法是method
@Jordan哦,当然!那为什么Ruby的Delegator会使用实例\u方法
?这是一个bug还是一个特性?