理论上,~~是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。我在这里错过了什么?
发布于 2019-04-03 02:12:21
你所拥有的有两个问题。
.ACCEPTS。
给出'abc‘{ ($_ eq 'XYZ').ACCEPTS($_) }#^^#XYZ#+
在上面的例子中,$_ eq 'XYZ'是False,False.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')~~的右侧可以决定smartmatch是如何发生的。唯一可能发生的方法是,如果方法调用在它上,而不是左侧。(请注意,上述所有内容也适用于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发布于 2019-04-02 19:01:50
难道不是另一种方式吗?
say 'Oðinn' ~~ %myth-objects;根据doc: smartmatch操作符将左侧化名为$_,然后评估右侧并在其上调用.ACCEPTS($_)。
https://stackoverflow.com/questions/55481126
复制相似问题