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)            #=> #<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>