超级操作员的奇怪行为

Strange behavior of a hyperoperator

我发现超级操作者的这种奇怪行为:

say 0 != 0;                 # False

my @a = 0, 0, 0;
say @a «==» @a;             # [True True True]
say @a «!=» @a;             # [True True True] <--- why?
say @a «!==» @a;            # [False False False]

!= 中缀运算符被定义为 here 等同于 !== 虽然显然不是,至少在超级运算符中使用时是这样。

问题似乎与特定值(零)有关,因为使用不同的值 returns 预期结果。 此外,使用 0 but True 效果很好:

@a = 0 but True, 0 but True, 0 but True;
say @a «!=» @a;             # [False False False]

我正在使用 Rakudo 2022.03。

这是错误还是我无法理解?

这绝对是一个错误,如下所示:

my @a = 0, 0, 0;
say HYPER(&infix:<<!=>>, @a, @a);  # [False False False]

给出了正确的结果。但是,传递给 HYPER 的是 而不是 &infix:<<!=>>,而是一个显然(错误地)包装它的代码块。

正在进一步调查,但是,是的,这是一个错误,因此应该报告 :-)

编辑:https://github.com/rakudo/rakudo/issues/4838

编辑:https://github.com/rakudo/rakudo/pull/4839 修复了它,但我不确定它修复它的方式:-)

编辑:修复已被 jnthn 批准,合并。将于2022.04。感谢您的关注!