哈希的ACCEPTS与smartmatch:有什么区别?

问题描述 投票:6回答:2

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

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。我在这里错过了什么?

perl6
2个回答
7
投票

你有什么问题。

  1. Smartmatch有两个执行层。 一个是立即的 'abc' ~~ $_ eq 'XYZ' 然后在结果上调用.ACCEPTS,给定值作为参数 do given 'abc' { ($_ eq 'XYZ').ACCEPTS($_) } # ^ ^ # | | # +------- 'abc'-------+ 在上面的例子中,$_ eq 'XYZ'False,而False.ACCEPTS(|)总是返回False。 (同样True.ACCEPTS(|)总是返回True。) 你也可以返回一个Callable。 'abc' ~~ * eq 'XYZ' 这似乎具有删除第一个直接图层的效果。 (虽然它实际上并没有这样做。) do given 'abc' { (* eq 'XYZ').ACCEPTS($_) } do given 'abc' { (* eq 'XYZ').($_) } do given 'abc' { $_ eq 'XYZ' } 或者它可以返回一个类型或文字。 'abc' ~~ ( 1 ?? Str !! Int ) # 'abc' ~~ Str do given 'abc' { ( 1 ?? Str !! Int ).ACCEPTS($_) } do given 'abc' { ( Str ).ACCEPTS($_) } Str .ACCEPTS('abc')
  2. 你有左手边,右手边交换了。 这两行是相似的。 (忽略实际上有两个执行层。) 'abc' ~~ 'XYZ' 'XYZ'.ACCEPTS('abc') 需要记住的重要一点是,~~的右侧可以决定智能匹配的发生方式。可能发生的唯一方法是方法调用是否在其上,而不是左侧。

(请注意,以上所有内容也适用于whenwhere条款。因为它们也是smartmatch的功能。)


所以当然这些都有不同的结果。

%myth-objects.ACCEPTS("Oðinn")
%myth-objects ~~ "Oðinn"

这三个是相似的。

         %myth-objects ~~ "Oðinn"
do given %myth-objects {  "Oðinn".ACCEPTS($_) }          # identical
                          "Oðinn".ACCEPTS(%myth-objects) # simplified

就像这些

                    %myth-objects.ACCEPTS("Oðinn")
do given "Oðinn" {  %myth-objects.ACCEPTS($_) }    # expanded to two layers
         "Oðinn" ~~ %myth-objects                  # smartmatched

6
投票

这不是另一种方式:

say 'Oðinn' ~~ %myth-objects;

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

© www.soinside.com 2019 - 2024. All rights reserved.