我有Delegator
果然與Kernel.respond_to?
或Kernel.instance_method
Ruby代理。定義調用方法類/模塊外:NameError
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
該代碼在Ruby 2.3.0中爲我生成了正確的結果。 – tadman
那麼你複製粘貼這段代碼並且沒有錯誤地運行它?這很奇怪。你在使用什麼操作系統? –
對於像這樣簡單的代碼,OS幾乎不是一個因素。你在使用Ruby 2還是更好? – tadman