Introspection of method parameters


#1

I’m trying to find out the number and name of a method’s parameters.
I’ve googled for ‘ruby method parameter introspection’ and come up
with almost nothing. Is there a way to ask a method for the
parameters it takes?

Could this way also show me the method overloads?
foo()
foo(param1)
foo(param1, param2)
etc.

thanks,


#2

Try this …

http://www.rubycentral.com/book/ospace.html

-Dave


#3

Ok, I tried that and it gets me to where I am now, I can see the
methods for an object, but I can’t tell if the method

a.) takes a parameter
b.) if it takes a parameter the # of parameters it takes.

On 3/22/06, David I. removed_email_address@domain.invalid wrote:

Try this …

http://www.rubycentral.com/book/ospace.html

-Dave

etc.

thanks,


#4

On 3/22/06, Keith S. removed_email_address@domain.invalid wrote:

Ok, I tried that and it gets me to where I am now, I can see the
methods for an object, but I can’t tell if the method

a.) takes a parameter
b.) if it takes a parameter the # of parameters it takes.

Both can be answered using the arity method in the class Method.

For example, how many parameters does the Math class method sin take?
puts Math.method(:sin).arity
outputs 1

How may parameters does the String instance method slice take?
String.new.method(:slice).arity
outputs -1
This is because slice takes a variable number of arguments.
In this case the return value is -n-1 where n is the number of
required arguments.
So the number of required arguments is zero.
But I don’t think that’s true. It looks to me like slice requires 1
argument!


#5

On Thu, Mar 23, 2006 at 06:31:43AM +0900, Keith S. wrote:

Ok, I tried that and it gets me to where I am now, I can see the
methods for an object, but I can’t tell if the method

a.) takes a parameter
b.) if it takes a parameter the # of parameters it takes.

RUBY_VERSION # => “1.8.4”
class Foo
def foo(a); end
def bar(a,b); end
def baz(a,*b); end # negative arity
def nop; end
end

%w[foo bar baz nop].each{|x| p [x, Foo.instance_method(x).arity]}

>> [“foo”, 1]

>> [“bar”, 2]

>> [“baz”, -2]

>> [“nop”, 0]


#6

On Thu, 2006-03-23 at 06:15 +0900, Keith S. wrote:

I’m trying to find out the number and name of a method’s parameters.
I’ve googled for ‘ruby method parameter introspection’ and come up
with almost nothing. Is there a way to ask a method for the
parameters it takes?

I wrote a little thing 1 a while ago that lets you get the names of
method arguments, though with some limitations (no C methods, no
differentiation of block/splat args, etc).

Could this way also show me the method overloads?
foo()
foo(param1)
foo(param1, param2)
etc.

Ruby doesn’t have method overloading.


#7

Try this …

class Test
def initialize
end

def one( a )
end

def two( a, b )
end
end

t = Test.new
m1 = t.method( :one )
m2 = t.method( :two )

puts “Method one has " + m1.arity.to_s + " parameters”
puts “Method one has " + m2.arity.to_s + " parameters”

=> Method one has 1 parameters
=> Method two has 2 parameters

-Dave