Getting the name of arguments a method takes


#1

I am wondering if there is a way to programatically get the name of the
arguments a function take.

Say, I have this code:
class MyClass
def my_fct(a, b, c)
end
end

Now, I can easily get a handle to the method ‘my_fct’ using:
mc = MyClass.new
meth = mc.method(:my_fct)

But how do I get to the list of arguments of ‘my_fct’ ? I couldn’t find
anything like:
meth.arg_list
which would return [ :a, :b, :c ], or something like that.

Is this even possible in ruby ?

-Didier


#2

Didier Prophete wrote:

I am wondering if there is a way to programatically get the name of the
arguments a function take.

Say, I have this code:
class MyClass
def my_fct(a, b, c)
end
end

Now, I can easily get a handle to the method ‘my_fct’ using:
mc = MyClass.new
meth = mc.method(:my_fct)

But how do I get to the list of arguments of ‘my_fct’ ? I couldn’t find
anything like:
meth.arg_list
which would return [ :a, :b, :c ], or something like that.

Is this even possible in ruby ?

-Didier

i also would like to do this. anybody know if it’s possible, and also
getting arg names from a proc? if so it would be very handy for
metaprogramming.

thanks


#3

Guest wrote:

Now, I can easily get a handle to the method ‘my_fct’ using:
-Didier

i also would like to do this. anybody know if it’s possible, and also
getting arg names from a proc? if so it would be very handy for
metaprogramming.

The short answer: no, it’s not possible. What do you want it for?

There’s always this way, though:

def method_arg_names(method_name, file)
File.read(file)[/def #{Regexp.escape method_name}(.*()|$))/, 1]
end

p method_arg_names(“method_arg_names”, $0) #=> “(method_name, file)”

Cheers,
Dave


#4

On Tue, 2006-05-02 at 09:17 +0900, Dave B. wrote:

getting arg names from a proc? if so it would be very handy for
p method_arg_names(“method_arg_names”, $0) #=> “(method_name, file)”

Cheers,
Dave

Also, this, if you’re only dealing with Ruby methods and are in a
kamikaze kind of mood:

class Method
def arg_names
catch(:traced) do
dummy_args = [nil]
dummy_args *= self.arity unless self.arity < 0

  set_trace_func lambda { |event, file, line, id, bdng, cls|
    if event == 'call'
      set_trace_func nil
      throw(:traced, eval('local_variables',bdng).map { |lv| 

lv.intern })
end
}

  self.call(*dummy_args)

  # if we get here, call is bust
  set_trace_func nil
  raise "No ruby method call in block"
end

end
end

Doesn’t work for procs, though.