从理论上讲,~~是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
。我在这里错过了什么?
你有什么问题。
'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
这不是另一种方式:
say 'Oðinn' ~~ %myth-objects;
根据文档:smartmatch操作符将左侧别名为$ _,然后评估右侧并在其上调用.ACCEPTS($ _)。