首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接受与聪明匹配的哈希:有什么区别吗?

接受与聪明匹配的哈希:有什么区别吗?
EN

Stack Overflow用户
提问于 2019-04-02 18:11:18
回答 2查看 134关注 0票数 6

理论上,~~是ACCEPTS的语法糖,所以最后两行应该返回相同的值:

代码语言:javascript
复制
my %myth-objects =  %(Þor => "Mjólnir", Oðinn => "Hugin") ;
say %myth-objects;
say %myth-objects.ACCEPTS("Oðinn");
say %myth-objects ~~ "Oðinn";

但是,第一个返回True,第二个返回False。我在这里错过了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-03 02:12:21

你所拥有的有两个问题。

  1. Smartmatch有两个执行层。 一个是即时的 ‘'abc’~~ $_ eq 'XYZ‘ 然后以给定的值作为参数,对结果调用.ACCEPTS。 给出'abc‘{ ($_ eq 'XYZ').ACCEPTS($_) }#^^#XYZ#+ 在上面的例子中,$_ eq 'XYZ'FalseFalse.ACCEPTS(|)总是返回False。 (类似地,True.ACCEPTS(|)总是返回True。) 您还可以返回可调用的。 ‘'abc’~~ * eq 'XYZ‘ 这似乎会有移除第一个直接层的效果。 (但它实际上并没有做到这一点。) 给定'abc‘{ (* eq 'XYZ').ACCEPTS( $_ ) } do给定'abc’{ (* eq 'XYZ‘)。($_)} do给定'abc’{$_ eq‘XYZ’} 也可以返回类型或文字。 ‘'abc’~(1?)?斯特尔!![ Int ]# 'abc‘~~ Str给出了'abc’{(1?斯特尔!!.ACCEPTS($_)} do给定'abc‘{( Str ).ACCEPTS($_) } Str .ACCEPTS('abc')
  2. 左手边,右手边交换。 这两行是相似的。 (忽略了实际上有两个执行层。) 'abc‘~ 'XYZ’‘XYZ’. 需要记住的重要一点是,~~的右侧可以决定smartmatch是如何发生的。唯一可能发生的方法是,如果方法调用在它上,而不是左侧。

(请注意,上述所有内容也适用于whenwhere子句。因为它们也是smartmatch特性。)

当然,它们有不同的结果。

代码语言:javascript
复制
%myth-objects.ACCEPTS("Oðinn")
%myth-objects ~~ "Oðinn"

这三个是相似的。

代码语言:javascript
复制
         %myth-objects ~~ "Oðinn"
do given %myth-objects {  "Oðinn".ACCEPTS($_) }          # identical
                          "Oðinn".ACCEPTS(%myth-objects) # simplified

就像这些

代码语言:javascript
复制
                    %myth-objects.ACCEPTS("Oðinn")
do given "Oðinn" {  %myth-objects.ACCEPTS($_) }    # expanded to two layers
         "Oðinn" ~~ %myth-objects                  # smartmatched
票数 7
EN

Stack Overflow用户

发布于 2019-04-02 19:01:50

难道不是另一种方式吗?

代码语言:javascript
复制
say 'Oðinn' ~~ %myth-objects;

根据doc: smartmatch操作符将左侧化名为$_,然后评估右侧并在其上调用.ACCEPTS($_)。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55481126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档