意外失败:存在于 raku

hsm*_*ers 8 hash key exists 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
>
Run Code Online (Sandbox Code Playgroud)

总之,问题是你如何从匹配对象到字符串,这样 %whatever:exists 将起作用。“键元素”提供了一种解决方法,但我认为这不是检查键是否存在的正确方法?

Bra*_*ert 7

<a b c>是 的快捷方式qw<a b c>
最终将成为'a', 'b', 'c'

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

%h{'a', 'b', 'c'}
Run Code Online (Sandbox Code Playgroud)

写成这样会更好:

%h{<a b c>}
Run Code Online (Sandbox Code Playgroud)

更好的是摆脱 {}

%h<a b c>
Run Code Online (Sandbox Code Playgroud)

这就是为什么这是有效的 Raku 语法。

所以当你写这个时:

%h<$n>
Run Code Online (Sandbox Code Playgroud)

它基本上与以下相同:

%h{'$n'}
Run Code Online (Sandbox Code Playgroud)

如果您只访问一个元素,并且它没有空格。
而不是一直这样做:

%h{'abc'}
Run Code Online (Sandbox Code Playgroud)

使用它要简单得多:

%h<abc>
Run Code Online (Sandbox Code Playgroud)

这就是所有文档都使用这种形式的原因。


同样,这些也是相同的:

$/{<a b c>}
$/<a b c>
$<a b c>
Run Code Online (Sandbox Code Playgroud)

所以如果你看到$<abc>它真的在寻找$/与 key 关联的值abc

Raku 中有很多语法重用。<>就是这样一种情况。


笔记:

您不需要.keys在 Hash 上使用?.

'B'  ?  %h;   # True
Run Code Online (Sandbox Code Playgroud)

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


jjm*_*elo 6

Str使用 ~将匹配项放入上下文中,但我认为问题在于您<>对变量使用文字引号。%h<$n>返回与文字键 $n 对应的值。您需要使用 %h{$n} 来检索与$n. 此外,如果 $n 包含 aMatch它将被放入 Str 上下文中,因此应该可以工作。