Buenas, tengo unos problemillas con el splat operator y querÃa ver si
alguien me puede ayudar. Escribo primero el código y luego cuento el
problema:
class Reporter
def <<(*args)
...
end
end
proc = lambda { |*args| @reporter << args }
proc.call('first arg', 'second arg')
El problema es que quiero llamar al método "<<" con un número variable
de
argumentos desde dento de un Proc, pero dentro del método "<<" solo me
llega
un argumento que es un array con todos los parámetros. Supongo que el
error
está a la hora de llamar al médodo dentro del proc pero no se como
escribirlo para solucionarlo.
Por si acaso, he estado leyendo el post de Javier sobre el splat
operator
pero no me ha solucionado nada:
http://formatinternet.wordpress.com/2007/11/04/splat-operator/
Saludos
on 29.04.2008 12:47
on 29.04.2008 13:24
buenas, Buenas, tengo unos problemillas con el splat operator y querÃa ver si > alguien me puede ayudar. Escribo primero el código y luego cuento el > problema: > > class Reporter > def <<(*args) > ... > end > end en ese caso sobre tu objeto reporter puedes hacer @reporter.<< param1, param2, param3 y te llegarán como un array siempre sin tener que hacerle nada más saludos, javier ramÃrez
on 29.04.2008 13:40
ya pero lo que quiero es pasarle los argumentos con los que he llamado al proc que de por sà es una lista variable, pero en lugar de llegarme como un array con todos los parámetros me llega un array con un parámetro que es el array con todos. On Tue, Apr 29, 2008 at 1:24 PM, Javier Ramirez <jramirez@aspgems.com>
on 29.04.2008 13:51
2008/4/29 David Calavera <david.calavera@gmail.com>: > ya pero lo que quiero es pasarle los argumentos con los que he llamado al > proc que de por sà es una lista variable, pero en lugar de llegarme como un > array con todos los parámetros me llega un array con un parámetro que es el > array con todos. > > Eso es porque con @reporter << args estas pasando como argumento un array, y en la definición del método <<, el spalt esta metiendo ese array como primer valor del array con todos los argumentos. Para conseguir lo que creo que quieres, bastarÃa con que cambies la definición del método a: class Reporter def <<(args=[]) ... end end
on 29.04.2008 13:55
Pues si, bien visto Juanjo, creo que estaba obcecado con el proc y no veÃa que la solución era mucho más fácil que todo eso XD. Gracias 2008/4/29 Juanjo Bazán <jjbazan@gmail.com>:
on 29.04.2008 14:30
También puedes cambiar el proc por
proc = lambda { |*args| @reporter << *args }
que creo que funcionan como tú pedías.
Por cierto, quiza no sea yo quien tenga que hablar pero las últimas
dos dudas que he respondido son más de Ruby que de Rails, y en existe
Rubíes <http://ruby.org.es/pages/lista>, una lista para asuntos de
Ruby en español que casi nunca recibe ninguna duda.
Suerte.
2008/4/29 David Calavera <david.calavera@gmail.com>:
on 29.04.2008 14:34
On Apr 29, 2008, at 12:46 , David Calavera wrote: > proc = lambda { |*args| @reporter << args } > > proc.call('first arg', 'second arg') > > El problema es que quiero llamar al método "<<" con un número > variable de argumentos Ademas de las otras respuestas, para conseguir el objetivo original te faltaba un splat mas: proc = lambda { |*args| @reporter << *args } # NO FUNCIONA ^^^ El parser no entiende ese splat: syntax error, unexpected tSTAR No le he mirado con detalle pero puede que tenga que ver con que "<<" tiene pinta de operador. Tecnicamente es posible conseguirlo: proc = lambda { |*args| @reporter.<<(*args) } pero queda un poco sospechoso :-). -- fxn
on 29.04.2008 14:48
On Tue, Apr 29, 2008 at 2:31 PM, Xavier Noria <fxn@hashref.com> wrote: > > end > > proc = lambda { |*args| @reporter.<<(*args) } > > pero queda un poco sospechoso :-). > > -- fxn Lo cierto es que lo probé con una función, en vez de con el operador <<, pero es cierto, con el operador parece que no funciona y que la forma correcta de utilizarlo sería la que propone Xavier. Probando me he dado cuenta de que @reporter << 'a', 'b', 'c' Tampoco funciona (digamos que << no se comporta como = cuando trata con rvalues separados por comas). Bai.