Este código parece crear una matriz con un rango de una a z, pero no entiendo qué hace el *
. ¿Alguien puede explicar?¿Qué significa un * delante de una cadena literal en rubí?
[*"a".."z"]
Este código parece crear una matriz con un rango de una a z, pero no entiendo qué hace el *
. ¿Alguien puede explicar?¿Qué significa un * delante de una cadena literal en rubí?
[*"a".."z"]
Se llama splat operator.
splatting un lValue
Un máximo de un lvalue puede splatted en cuyo caso se le asigna una matriz que consiste en los rvalues restantes que carecen de lvalues correspondientes. Si el valor l derecho está salpicado, consume todos los valores r que aún no se han emparejado con lvalues. Si un lvalue splatted va seguido de otros lvalues, consume tantos valores como sea posible sin dejar de permitir que los siguientes lvalues reciban sus valores r.
*a = 1 a #=> [1] a, *b = 1, 2, 3, 4 a #=> 1 b #=> [2, 3, 4] a, *b, c = 1, 2, 3, 4 a #=> 1 b #=> [2, 3] C#=> 4
Splat vacío
Un lvalue puede consistir en un único asterisco (U + 002A) sin ningún identificador asociado. Se comporta como se describió anteriormente, pero en lugar de asignar los valores r correspondientes al valor l splatted, los descarta.
a, *, b = *(1..5) a #=> 1 b #=> 5
splatting un RValue
Cuando un rvalue se splatted se convierte en una matriz con Kernel.Array(), los elementos de los cuales se convierten en rvalues en su propio derecho.
a, b = *1 a #=> 1 b #=> nil a, b = *[1, 2] a #=> 1 b #=> 2 a, b, c = *(1..2), 3 a #=> 1 b #=> 2 C#=> 3
Además de asignar valores, también puede usar el operador splat para definir métodos: 'def do_it (arg1, * args)'. Ahora puede llamar a 'do_it (1, 2)' y 'do_it (1, 2, 3, 4)'. – Ariejan
El operador splat amplía la gama en una matriz.
En algunos casos *, esto es cierto. :) –
Eh, hecho de la diversión. Al hacer esto:
*(0..50)
aparece un error.
El operador splat, en este caso, requiere un receptor para poder trabajar. Así que no te engañes pensando que está roto en irb simplemente intentándolo sin un receptor.
En este caso, no está delante de un literal de cadena, está delante de un Rango. –