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

How to check that all elements of an array are defined in Perl 6?

> so (Any)
False

但是

> so [1, Any]
True

如何让它产生False

更新:这似乎可行,但我不确定这是正确的方法。

> so [1, Any].all
False

首先,(Any)不是一个List(Any,)(注意逗号)。您应该将第一种情况设为数组(如 [Any])。否则你就是在比较苹果和橙子:-)

当您给 so 一个列表时(小写列表在这种情况下表示 ArrayList),它将获取列表中元素的数量:所以每个至少有一个元素的列表,将给出 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。我将它留作 reader 的练习,以便使用 .first.

更快地做一些事情

如果您想要定义性而不是真实性检查,您还可以say [1, 2, Any].all.defined,这将通过连接自动线程化定义的方法调用。

say [1, 2, True].all.defined   # True
say [1, Int, True].all.defined # False