Issue #12113 has been updated by Nobuyoshi Nakada.


Benoit Daloze wrote:
> 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`?

It's necessary to avoid infinite recursion in the case of [Bug #9155].

----------------------------------------
Feature #12113: Global method inside Delegator causes NameError
https://bugs.ruby-lang.org/issues/12113#change-57204

* 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)            #=> #<Method: Module(Object)#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: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>