Curso de Raku / Avanzado / Subrutinas
La estrella Whatever
Es posible que hayas visto el * usado en expresiones
como * * 2 o * %% 2 al llamar a
map y grep. Ese * es la
estrella Whatever, y la expresión que lo rodea construye una
pequeña función de un argumento sobre la marcha. Esta sección explica
que es realmente, como se relaciona con un bloque y donde la estrella
sola significa simplemente “lo que quieras”.
Una estrella crea una función
Cuando * aparece en una expresión, Raku convierte toda
la expresión en una función — un WhateverCode — en la que
la estrella representa el argumento:
my $double = * * 2;
say $double.^name; # WhateverCode
say $double(21); # 42* * 2 es una función que multiplica su único argumento
por dos. Por eso (1..5).map(* * 2) funciona: a
map se le pasa exactamente esa función de un argumento.
Whatever versus un bloque
Una expresión Whatever es una forma más corta de escribir una función que también podrías escribir como un bloque. Estas tres son equivalentes:
* * 2
{ $_ * 2 }
-> $x { $x * 2 }La forma Whatever no nombra ningún parámetro; la forma de bloque usa
la variable topica $_; la forma puntiaguda nombra
$x. Esa última, -> $x { ... }, es una
pequeña función por derecho propio — la conocerás apropiadamente en Subrutinas anonimas; aquí
basta con leerla como una tercera forma de escribir la misma función de
un argumento. Para una expresión simple, la estrella es la más compacta,
por eso es tan común con map, grep y
sort:
say (1..5).map(* * 2); # (2 4 6 8 10)
say (1..5).map({ $_ * 2 }); # (2 4 6 8 10)
say (1..5).map(-> $x { $x * 2 }); # (2 4 6 8 10)Usa un bloque cuando la lógica necesite más de una expresión, o cuando un parámetro con nombre claro ayude. Usa la estrella cuando una expresión corta lo diga todo.
Más de una estrella
Cada * en la expresión es un argumento separado, en
orden. Así que dos estrellas crean una función de dos
argumentos:
my $add = * + *;
say $add(3, 4); # 7Aquí * + * es una función de dos argumentos que suma sus
argumentos — por ejemplo un total acumulado y el siguiente elemento.
La estrella Whatever sola
Por si sola, * significa “lo que sea” — tanto como haya,
o sin limite. Dos usos cotidianos:
my @a = 10, 20, 30;
say @a[*-1]; # 30 — * es la longitud del arreglo, asi que *-1 es el ultimo indice
say (1..*).head(3); # (1 2 3) — 1..* es un rango abiertoEn @a[*-1] la estrella representa el numero de
elementos, y en 1..* representa “sin limite superior”. Ya
sea que construya una función o signifique “lo que quieras”, la estrella
es una de las abreviaturas más útiles de Raku.
Práctica
Resuelve 1 cuestionario sobre el contenido de este tema.
Ejercicios
Esta sección contiene 3 ejercicios. Mira todos los temas de esta sección antes de empezar los ejercicios.