意外失败:存在于 raku 中

Unexpected FAIL with :exists in raku

在尝试调试程序代码时,我 运行 进入以下内容:

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

总而言之,问题是您如何从匹配对象到字符串,以便 %whatever:exists 起作用。 'Element of keys' 提供了一种解决方法,但我认为这不是检查密钥是否存在的正确方法?

您使用 ~ 在 Str 上下文中放置了匹配项,但我认为问题在于您的情况是您对变量使用了文字引号 <>%h<$n> returns 与文字键 $n 对应的值。您需要使用 %h{$n} 来检索与 $n 的内容对应的值。此外,如果 $n 包含一个 Match 它将被放入 Str 上下文中,这样应该可以工作。

<a b c>qw<a b c>.
的快捷方式 最终会变成 'a', 'b', 'c'

通过键访问哈希的方法是 {}

%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

'B'  ∈  %h;   # True

(由于 Raku 对不同的操作使用不同的运算符,因此您很少需要进行此类数据处理。)