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.

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.


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).


Su respuesta aclara muy bien la situación, ¡gracias!
— hsmyers
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.