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,

on 2006-03-22 23:15

on 2006-03-22 23:32

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,

on 2006-03-22 23:53

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!

on 2006-03-22 23:53

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]

on 2006-03-22 23:54

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

on 2006-03-23 00:42

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. [1]: http://roscopeco.blogspot.com/2006/02/callcc-vs-catch.html