From: nobu@... Date: 2016-02-28T05:17:01+00:00 Subject: [ruby-core:74031] [Ruby trunk Feature#12113] Global method inside Delegator causes NameError Issue #12113 has been updated by Nobuyoshi Nakada. Tracker changed from Bug to Feature Description updated It's the current spec that delegator cannot call private method of the target, because it was impossible to tell it was called as function call form, (without the receiver). https://github.com/ruby/ruby/compare/trunk...nobu:feature/12113-Delegator-private-method https://github.com/ruby/spec/compare/master...nobu:delegator-send ---------------------------------------- Feature #12113: Global method inside Delegator causes NameError https://bugs.ruby-lang.org/issues/12113#change-57182 * 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: