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

时间:2019-04-02 18:11:18

标签: perl6

从理论上讲,~~是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。我在这里想念什么?

2 个答案:

答案 0 :(得分:7)

您的物品有两个问题。

  1. 智能匹配具有两个执行层。

    一个是即时的

    '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

答案 1 :(得分:6)

不是吗?

final tot = 0
1st tot = 1
1st tot = 3
1st tot = 6
1st tot = 10
1st tot = 15
2nd tot = 15
final tot = 0
1st tot = 1
1st tot = 6

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