【问题标题】:Unexpected FAIL with :exists in raku意外失败与 :exists in raku
【发布时间】:2020-06-15 02:50:23
【问题描述】:

在尝试调试程序代码时,我遇到了以下问题:

(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 起作用。 “键元素”提供了一种解决方法,但我认为这不是检查键是否存在的正确方法?

【问题讨论】:

    标签: hash key exists raku


    【解决方案1】:

    &lt;a b c&gt;qw&lt;a b c&gt; 的快捷方式。
    最终将成为'a', 'b', 'c'

    通过key访问Hash的方式是{}

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

    因此,如果您看到 $&lt;abc&gt;,它实际上是在 $/ 内部寻找与键 abc 关联的值。

    在 Raku 中有很多语法重用。 &lt;&gt; 就是这样一种情况。


    注意:

    您不需要在带有 的哈希上使用.keys

    'B'  ∈  %h;   # True
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 合而为一!对于给出答案的问题的无知,我深表歉意:) 我只能说我是从官方文档中复制的。也许如果我再读几遍,我就会明白了。缺乏足够的例子一直是个问题……
      • 没有道歉,不需要。我们是来帮忙的。如果您对文档中的一些令人困惑的评论表示赞赏,请提出问题。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 2015-11-03
      • 2020-06-30
      • 2012-12-20
      相关资源
      最近更新 更多