Bug #12782
closedForwardable breaks on private methods in ruby 2.4
Description
Due to an optimization in r55376, attempting to forward to private methods no longer works in ruby 2.4. Among other things, this breaks haml template support in tilt. Example:
require 'forwardable'
class Foo
private def foo; :foo end
extend Forwardable
def_delegator :itself, :foo, :bar
end
p Foo.new.bar
On ruby 2.3, this outputs :foo, on 2.4.0preview2 it raises NoMethodError. I think r55376 should be reverted, as the optimization it uses does not appear to be able to handle private method calls.
Updated by nobu (Nobuyoshi Nakada) about 8 years ago
I suspect that it was a bug to able to delegate a private method.
Updated by jeremyevans0 (Jeremy Evans) about 8 years ago
- Assignee set to matz (Yukihiro Matsumoto)
Nobuyoshi Nakada wrote:
I suspect that it was a bug to able to delegate a private method.
It does seem like a bad idea to allow forwarding to private methods. However, the commit message did not mention that it fixes a bug, so I believe the behavior change was unintentional. Allowing delegating to private methods dates to forwardable's initial commit (in ruby 1.6), and there are ruby libraries relying on this behavior (tilt's haml support at least). Assigning to matz to make a decision on whether to break backwards compatibility.
Updated by marcandre (Marc-Andre Lafortune) about 8 years ago
The choice might be more between simply reverting and reverting but adding code to detect private calls and issue a deprecation warning so we can reintroduce the optimization in another version.
Updated by nobu (Nobuyoshi Nakada) about 8 years ago
- Status changed from Open to Closed
Applied in changeset r56210.
forwardable.rb: private methods
- lib/forwardable.rb (_delegator_method): allow private methods to
be delegated, with warnings. [ruby-core:77341] [Bug #12782]