Parameter name reflection

If I declare

def foo(a, b)
end

What code should I use to find the names of the parameters?
I only see these methods available on a Method object.
["[]", “arity”, “call”, “to_proc”, “unbind”]

For instance in PHP I could do this

function foo($a, $b) { }
$ref = new ReflectionFunction(‘foo’)
$ref->getParameters()[0]->getName(); // a
$ref->getParameters()[1]->getName(); // b

On Jul 3, 2008, at 1:43 PM, Oliver S. wrote:

function foo($a, $b) { }
$ref = new ReflectionFunction(‘foo’)
$ref->getParameters()[0]->getName(); // a
$ref->getParameters()[1]->getName(); // b

Posted via http://www.ruby-forum.com/.

cfp:~ > cat a.rb

def foo a, b
p local_variables
end

foo 4, 2
cfp:~ > ruby a.rb
[“a”, “b”]

as to why you’d want to do this though - i’ve no idea. why not use
options?

def foo options = {}
end

foo :a => 4, :b => 2

??

a @ http://codeforpeople.com/

Oliver S. wrote:

If I declare

def foo(a, b)
end

What code should I use to find the names of the parameters?

You could use ParseTree1 for that purpose:

require ‘rubygems’
require ‘parse_tree’

def foo(a, b)
end

sexp = ParseTree.translate(self.class, :foo)
args = sexp.assoc(:scope).assoc(:block).assoc(:args)[1…-1]
puts args[0] # => a
puts args1 # => b

HTH, Matthias.

On Jul 5, 2008, at 2:36 PM, Oliver S. wrote:

end

Posted via http://www.ruby-forum.com/.

bad idea ihmo - it’ll be almost impossible to map valid http request
names to ruby vars, for instance you’ll have

‘a var with a space’ #=> ??

‘a var with a /’ #=> ??

etc etc

in addition the only way you can do that is with a heavy duty eval
process (vars set by eval are only available to further evals) which
makes for a super slow request loop. so this sounds like it’ll end up
being a huge stack of evals - not metaprogramming - unless i’m
misunderstanding. can you sketch out an example of what you’d like to
do for us?

cheers.

a @ http://codeforpeople.com/

Thanks Matthias that looks pretty cool.

@ara.t.howard: this is useful as a meta-programming technique. Here’s an
example:

controller implementation

def index_action(id, style, redirected_from)
local_variables # pre-populated with values from HTTP request params
end