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