Mientras intentaba depurar el código del programa, me encontré con lo siguiente:
(base) hsmyers@BigIron:~$ rlwrap -A raku
To exit type 'exit' or '^D'
> my regex N { <[A..G]> };
regex N { <[A..G]> }
> my %h = A => 1, B => 2;
{A => 1, B => 2}
> 'B' ∈ %h.keys
True
> my $m = 'B' ~~ / <N> /;
「B」
N => 「B」
> $m ∈ %h.keys
False
> $m.Str ∈ %h.keys
True
> my $n = $m.Str
B
> $n ∈ %h.keys
True
> %h<B>:exists
True
> %h<$n>:exists
False
>
En resumen, la pregunta es cómo pasar de un objeto de coincidencia a una cadena de modo que% whatever: exist funcione. 'Elemento de claves' proporciona una solución, pero creo que esa no es la forma correcta de verificar la existencia de claves.
<a b c>
es un acceso directo paraqw<a b c>
.Que terminará como
'a', 'b', 'c'
La forma de acceder a un Hash por clave es con
{}
Lo que sería mejor escribir como:
Lo que sería aún mejor es deshacerse de
{}
Por eso es válida la sintaxis de Raku.
Entonces cuando escribes esto:
Básicamente es lo mismo que:
Si solo está accediendo a un elemento, y no tiene espacios en blanco.
En lugar de hacer esto todo el tiempo:
Es mucho más simple usar:
Es por eso que toda la documentación utiliza ese formulario.
Del mismo modo, estos también son lo mismo:
Entonces, si ve
$<abc>
que realmente está buscando$/
el valor asociado con la claveabc
.Hay mucha reutilización de sintaxis en Raku.
<>
Es uno de esos casos.Nota:
No necesita usar
.keys
en un hash con∈
.(Dado que Raku usa diferentes operadores para diferentes operaciones, es raro que tenga que hacer ese masaje de datos).
fuente