从理论上讲,~~是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
。我在这里想念什么?
答案 0 :(得分:7)
您的物品有两个问题。
智能匹配具有两个执行层。
一个是即时的
'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')
您有左手边,而右手边已调换。
这两行相似。
(忽略了实际上有两个执行层。)
'abc' ~~ 'XYZ'
'XYZ'.ACCEPTS('abc')
要记住的重要一点是~~
的右侧决定了智能匹配的发生方式。唯一可能发生的方法是调用了方法,而不是在左侧。
(请注意,以上所有内容同样适用于when
和where
子句,因为它们也是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($ _)。