From: Oliver Saunders on
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/.

From: ara.t.howard on

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


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/
--
we can deny everything, except that we have the possibility of being
better. simply reflect on that.
h.h. the 14th dalai lama




From: Matthias Reitinger on
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/.

From: Oliver Saunders on
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/.

From: ara.t.howard on

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


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/
--
we can deny everything, except that we have the possibility of being
better. simply reflect on that.
h.h. the 14th dalai lama