From: eregontp@... Date: 2016-02-29T10:17:44+00:00 Subject: [ruby-core:74048] [Ruby trunk Feature#12113] Global method inside Delegator causes NameError Issue #12113 has been updated by Benoit Daloze. Nobuyoshi Nakada wrote: > Benoit Daloze wrote: > > Would that solve the OP example code since `some_func` is defined in `Object`, not `Kernel`? > > It is because of the private method of the target, in `Object` or in `Kernel` or in target itself is not the point. Ah, right, because in this case the method would be found on target since target is an Object (a Fixnum actually). Would this patch allow to remove the special case for Kernel dispatch then? Or should it be kept for compatibility if !target.is_a?(Kernel) and most likely a BasicObject. ---------------------------------------- Feature #12113: Global method inside Delegator causes NameError https://bugs.ruby-lang.org/issues/12113#change-57203 * Author: Oleg Antonyan * Status: Open * Priority: Normal * Assignee: ---------------------------------------- ~~~ruby def some_func puts '12' end class Klass < Delegator def initialize(obj) @obj = obj end def __getobj__ @obj end def func some_func #=> /home/oleg/.rbenv/versions/2.3.0/lib64/ruby/2.3.0/delegate.rb:85:in `instance_method': undefined method `some_func' for module `Kernel' (NameError) end end Klass.new(0).func ~~~ Delegator uses Kernel.instance_method (https://github.com/ruby/ruby/blob/trunk/lib/delegate.rb#L85) but: ~~~ruby ::Kernel.respond_to?(:some_func, true) #=> true ::Kernel.instance_method(:some_func) #=> `instance_method': undefined method `some_func' for module `Kernel' (NameError) ::Kernel.method(:some_func) #=> # ~~~ I think there should be `Kernel.method` instead of `instance_method` (in Delegator). Otherwise you get `respond_to?` == `true`, but cannot use this method and get an error. -- https://bugs.ruby-lang.org/ Unsubscribe: