Parameter name reflection

  • Thread starter Oliver Saunders
  • Start date
O

Oliver Saunders

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
 
A

ara.t.howard

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


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

Matthias Reitinger

Oliver said:
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/
 
O

Oliver Saunders

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
 
A

ara.t.howard

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


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/
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top