FALHA inesperada com: existe em raku

8

Ao tentar depurar o código do programa, encontrei o seguinte:

(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
>

Em suma, a questão é como você passa do objeto de correspondência para a cadeia de caracteres, de modo que% any: exist funcione. 'Elemento de chaves' fornece uma solução alternativa, mas acredito que não é a maneira correta de verificar a existência de chaves?

hsmyers
fonte

Respostas:

6

Você coloca correspondências no Strcontexto usando ~, mas acho que o problema é que você está usando aspas literais <>para uma variável. %h<$n>retorna o valor correspondente à chave literal $ n. Você precisa usar% h {$ n} para recuperar o valor correspondente ao conteúdo de $n. Além disso, se $ n contiver um, Matchele será colocado no contexto Str, portanto, isso deve funcionar.

jjmerelo
fonte
Entendi em um! Peço desculpas pela ignorância da pergunta dada a resposta :) Só posso dizer que estava copiando da documentação oficial. Talvez se eu tivesse relido várias vezes, teria conseguido. A falta de exemplos suficientes tem sido um problema ...
hsmyers 02/03
Não pedimos desculpas, não é necessário. Nós estamos aqui para ajudar. E se você aprecia algumas observações confusas na documentação, levante um problema. Obrigado!
jjmerelo 03/03
7

<a b c>é um atalho para qw<a b c>.
Que acabará como'a', 'b', 'c'

A maneira de acessar um Hash por chave é com {}

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

O que seria melhor escrever como:

%h{<a b c>}

O que seria ainda melhor é se livrar do {}

%h<a b c>

É por isso que é válida a sintaxe Raku.

Então, quando você escreve isso:

%h<$n>

É basicamente o mesmo que:

%h{'$n'}

Se você estiver acessando apenas um elemento e ele não tiver espaço em branco.
Em vez de fazer isso o tempo todo:

%h{'abc'}

É muito mais simples usar apenas:

%h<abc>

É por isso que toda a documentação usa esse formulário.


Da mesma forma, estes também são os mesmos:

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

Portanto, se você vir, $<abc>ele está realmente procurando $/o valor associado à chave abc.

Há muita reutilização de sintaxe em Raku. <>é um desses casos.


Nota:

Você não precisa usar .keysum Hash com .

'B'    %h;   # True

(Como o Raku usa operadores diferentes para operações diferentes, é raro você precisar fazer essa massagem de dados.)

Brad Gilbert
fonte
Sua resposta esclarece bem a situação - obrigado!
hsmyers 5/03