Неожиданный сбой с: существует в raku - PullRequest
8 голосов
/ 02 марта 2020

При попытке отладки программного кода я наткнулся на следующее:

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

В итоге вопрос состоит в том, как сделать go из сопоставления объекта со строкой, так что% независимо от того: существует будет работать. «Элемент ключей» предоставляет обходной путь, но я считаю, что это не правильный способ проверки существования ключа?

Ответы [ 2 ]

7 голосов
/ 02 марта 2020

<a b c> - это сокращение для qw<a b c>.
, которое в итоге будет иметь вид 'a', 'b', 'c'

. Для доступа к Ha sh по ключу используется {}

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

Что было бы лучше написать как:

%h{<a b c>}

Что было бы еще лучше, так это избавиться от {}

%h<a b c>

Вот почему это допустимый синтаксис Raku.

Поэтому, когда вы пишете это:

%h<$n>

Это в основном то же самое, что:

%h{'$n'}

Если вы обращаетесь только один элемент, и у него нет пробелов.
Вместо того, чтобы делать это все время:

%h{'abc'}

Гораздо проще просто использовать:

%h<abc>

Вот почему вся документация использует эту форму.


Точно так же они одинаковы:

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

Так что, если вы видите $<abc>, это действительно заглядывает внутрь $/ для значение связывается с ключом abc.

В Raku много повторного использования синтаксиса. <> является одним из таких случаев.


Примечание:

Вам не нужно использовать .keys на Ha sh с .

'B'  ∈  %h;   # True

(Так как Raku использует разные операторы для разных операций, вам редко приходится выполнять такую ​​обработку данных.)

6 голосов
/ 02 марта 2020

Вы помещаете совпадения в контекст Str, используя ~, но я думаю, что проблема в том, что вы используете буквальные кавычки <> для переменной. %h<$n> возвращает значение, соответствующее буквальному ключу $ n. Вам нужно использовать% h {$ n}, чтобы получить значение, соответствующее содержимому $n. Также, если $ n содержит Match, оно будет помещено в контекст Str, так что это должно работать.

...