为什么 0 有时是数字有时不是数字?

sid*_*com 4 raku

为什么0有时是数字有时不是数字?

my @numbers = -1, 0, 1, 'hello';
.say for @numbers.grep( Numeric );
say "====";
for @numbers -> $n {
    say $n if $n.Numeric;
}
Run Code Online (Sandbox Code Playgroud)
#-1
#0
#1
#====
#-1
#1
Run Code Online (Sandbox Code Playgroud)

Eli*_*sen 13

问题出在你的解释上$n.Numeric。您似乎认为它返回 aBool来指示某物是否存在Numeric(尽管您自己的示例显示情况并非如此)。

无论如何,$n.Numeric 强制转换为一个Numeric值。但由于已经0 一个Numeric值(如您的grep示例所示),因此它实际上是一个无操作。

那为什么不显示呢?嗯,原因很简单,0.Bool就是False1.Bool(-1).BoolTrue。所以在if声明中:

say $n if $n.Numeric;
Run Code Online (Sandbox Code Playgroud)

0不会显示,因为if从概念上讲,它是在Bool幕后进行的。这不会火,因为0.Numeric.BoolFalse

你可能想做

say $n if $n ~~ Numeric;
Run Code Online (Sandbox Code Playgroud)

将测试 $n 是否有Numeric值。