Can someone point out an elegant way to solve the following problem?
I have a module with a function f and additional functions g1, g2, …,
which basically looks like this:
module M
def f(&cb)
…
x=cb.call
# DO SOMETHING … see below
end
def g1(a,b,c)
…
end
def g2(d,e)
…
end
etc
end
The DO SOMETHING part looks like this: The proc object being called
is supposed to return an array, where the first element is a symbol
corresponding to one of the function names g1, g2 …, and the
remaining array elements corresponding to the parameters of this
function. Hence, if
x=cb.call
causes x to contain [:g2, 25, ‘dummy’], I would like to execute
g2(25,‘dummy’)
I have not found a convincing way of doing this. Of course I can
use a big case … end on the function names (ugly). I can turn
the symbol :g2 into a string ‘g2’, marshal the arguments and put
together a string containing the function call (even uglier).
I also thought about using a hash of proc object (the keys being
the symbols, the values being the procedures), kind of
{:g1 => proc {|a,b,c] g1(a,b,c)}, :g2 => proc {|d,e| g2(d,e)
},…}[x[0]].
call(*x[1…-1])
but this looks like tremendous overkill too. Is there a simpler
way of doing it?
Ronald
Ronald F. [email protected]
Phone: +49-89-452133-162