如何在Perl 6中检查数组的所有元素是否已定义?

3
> so (Any)
False

但是。
> so [1, Any]
True

如何使其产生False

更新:这似乎可以工作,尽管我不确定这是否是正确的方法。

> so [1, Any].all
False
2个回答

6
首先,(Any) 不是一个 List(Any,) 才是 (注意逗号)。你应该将第一种情况改为数组(例如 [Any])。否则你就在比较苹果和橙子 :-)
当你给 so 一个列表(小写列表指的是这个上下文中的 Array 或者 List),它将获取列表中的元素数量:所以每个至少有一个元素的列表都会返回 True。
回答你的问题,有很多方法可以做到这一点,但所有方法都需要至少部分地遍历列表。如果你确信你的列表不包含 0 或空字符串,你可以做一些简单的事情,比如:
say so [&&] (1,Any,3); # False
say so [&&] (1,2,3);   # True
[&&]基本上是在表示:1 && Any && 31 && 2 && 3
如果您不能确定这一点,那么您将需要执行额外的步骤:
say [&&] (1,Any,3).map: *.defined; # False
say [&&] (1,0,3).map: *.defined;   # True

请注意,在这种情况下,您不必执行so,因为.map已经将值转换为TrueFalse。我把使用.first更快的方法留给读者作为练习。

谢谢!我忘记了 so 0 == False - Eugene Barsky
1
确实,已经修复。谢谢! - Elizabeth Mattijsen

2
如果你想进行定义性检查而不是真实性检查,你也可以使用say [1, 2, Any].all.defined,这将自动在连接点上进行定义方法调用。
say [1, 2, True].all.defined   # True
say [1, Int, True].all.defined # False

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接