为什么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就是False、1.Bool和(-1).Bool是True。所以在if声明中:
say $n if $n.Numeric;
Run Code Online (Sandbox Code Playgroud)
0不会显示,因为if从概念上讲,它是在Bool幕后进行的。这不会火,因为0.Numeric.Bool是False。
你可能想做
say $n if $n ~~ Numeric;
Run Code Online (Sandbox Code Playgroud)
这将测试 $n 是否有Numeric值。