FALLO inesperado con: existe en raku

8

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.

hsmyers
fuente

Respuestas:

6

Pones coincidencias en Strcontexto usando ~, pero creo que el problema es que tu caso es que estás usando comillas literales <>para una variable. %h<$n>devuelve el valor correspondiente a la clave literal $ n. Debe usar% h {$ n} para recuperar el valor correspondiente al contenido de $n. Además, si $ n contiene un Match, se pondrá en contexto Str, por lo que debería funcionar.

jjmerelo
fuente
Lo tengo en uno! Pido disculpas por la ignorancia de la pregunta dada la respuesta :) Solo puedo decir que estaba copiando de la documentación oficial. Quizás si hubiera releído varias veces más, lo habría conseguido. La falta de suficientes ejemplos ha sido un problema ...
hsmyers
No se pidieron disculpas, no se necesitan. Estamos aquí para ayudar. Y si aprecia algunos comentarios confusos en la documentación, plantee un problema. ¡Gracias!
jjmerelo
7

<a b c>es un acceso directo para qw<a b c>.
Que terminará como'a', 'b', 'c'

La forma de acceder a un Hash por clave es con {}

%h{'a', 'b', 'c'}

Lo que sería mejor escribir como:

%h{<a b c>}

Lo que sería aún mejor es deshacerse de {}

%h<a b c>

Por eso es válida la sintaxis de Raku.

Entonces cuando escribes esto:

%h<$n>

Básicamente es lo mismo que:

%h{'$n'}

Si solo está accediendo a un elemento, y no tiene espacios en blanco.
En lugar de hacer esto todo el tiempo:

%h{'abc'}

Es mucho más simple usar:

%h<abc>

Es por eso que toda la documentación utiliza ese formulario.


Del mismo modo, estos también son lo mismo:

$/{<a b c>}
$/<a b c>
$<a b c>

Entonces, si ve $<abc>que realmente está buscando $/el valor asociado con la clave abc.

Hay mucha reutilización de sintaxis en Raku. <>Es uno de esos casos.


Nota:

No necesita usar .keysen un hash con .

'B'    %h;   # True

(Dado que Raku usa diferentes operadores para diferentes operaciones, es raro que tenga que hacer ese masaje de datos).

Brad Gilbert
fuente
Su respuesta aclara muy bien la situación, ¡gracias!
hsmyers