Forum: Ruby Introspection of method parameters

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Keith S. (Guest)
on 2006-03-22 23:15
(Received via mailing list)
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,
David I. (Guest)
on 2006-03-22 23:20
(Received via mailing list)
Keith S. (Guest)
on 2006-03-22 23:32
(Received via mailing list)
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,
Mark V. (Guest)
on 2006-03-22 23:53
(Received via mailing list)
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!
Mauricio F. (Guest)
on 2006-03-22 23:53
(Received via mailing list)
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]
David I. (Guest)
on 2006-03-22 23:54
(Received via mailing list)
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
Ross B. (Guest)
on 2006-03-23 00:42
(Received via mailing list)
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
This topic is locked and can not be replied to.