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

···

--
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/

···

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

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
-- Posted via http://www.ruby-forum.com/\.

--
we can deny everything, except that we have the possibility of being better. simply reflect on that.
h.h. the 14th dalai lama

Oliver Saunders wrote:

If I declare

def foo(a, b)
end

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

You could use ParseTree[1] 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 args[1] # => b

HTH, Matthias.

[1]: http://parsetree.rubyforge.org/ParseTree/

···

--
Posted via http://www.ruby-forum.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

···

--
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/

···

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

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
--
Posted via http://www.ruby-forum.com/\.

--
we can deny everything, except that we have the possibility of being better. simply reflect on that.
h.h. the 14th dalai lama