Ruby Forum Rails-ES > Problemas con splat operator

Posted by David Calavera (Guest)
on 29.04.2008 12:47
(Received via mailing list)
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
Posted by Javier Ramirez (Guest)
on 29.04.2008 13:24
(Received via mailing list)
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
Posted by David Calavera (Guest)
on 29.04.2008 13:40
(Received via mailing list)
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>
Posted by Juanjo Bazán (Guest)
on 29.04.2008 13:51
(Received via mailing list)
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
Posted by David Calavera (Guest)
on 29.04.2008 13:55
(Received via mailing list)
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>:
Posted by Daniel Rodriguez Troitiño (Guest)
on 29.04.2008 14:30
(Received via mailing list)
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>:
Posted by Xavier Noria (fxn)
on 29.04.2008 14:34
(Received via mailing list)
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
Posted by Daniel Rodriguez Troitiño (Guest)
on 29.04.2008 14:48
(Received via mailing list)
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.