Bug #7987

Method#parameters should consider a prepended or refined methd

Added by Nobuhiro IMAI about 1 year ago.

[ruby-core:53037]
Status:Open
Priority:Normal
Assignee:-
Category:core
Target version:-
ruby -v:ruby 2.1.0dev (2013-02-28 trunk 39535) [x86_64-linux] Backport:

Description

=begin
In the following example, *Method#parameters tell the number of argument is one,
but actual methods take two arguments. I got confused..

RUBYDESCRIPTION # => "ruby 2.1.0dev (2013-02-28 trunk 39535) [x8664-linux]"

module PM
def m(a, b)
:pm
end
end

class PC
prepend PM

def m(a)
:pc
end
end

pm = PC.instance_method(:m)
pm.owner # => #PC:0x00000001285888
pm.parameters # => :req, :a
pc = PC.new
pc.method(:m).owner # => #PC:0x00000001285888
pc.method(:m).parameters # => :req, :a
pc.m(:a) # => ArgumentError
pc.m(:a, :b) # => :pm

class RC
def m(a)
:rc
end
end

module RM
refine RC do # !> Refinements are experimental, and the behavior may change in future versions of Ruby!
def m(a, b)
:rm
end
end
end

using RM

rm = RC.instance_method(:m)
rm.owner # => RC
rm.parameters # => :req, :a
rc = RC.new
rc.method(:m).owner # => RC
rc.method(:m).parameters # => :req, :a
rc.m(:a) # => ArgumentError
rc.m(:a, :b) # => :rm
=end

Also available in: Atom PDF