> so (Any)
False
但
> so [1, Any]
True
如何使它生产False
?
UPD:这似乎有效,但我不确定这是正确的方法。
> so [1, Any].all
False
如果你想要定义而不是真实性检查,你也可以使用say [1, 2, Any].all.defined
,它会在结点上自动读取定义的方法调用。
say [1, 2, True].all.defined # True
say [1, Int, True].all.defined # False
首先,(Any)
不是List
,(Any,)
是(注意逗号)。您应该将第一个案例设为数组(如[Any]
)。否则你将苹果与橙子进行比较:-)
当你给so
一个列表(小写列表意味着Array
或List
在这个上下文中)时,它将占用列表中的元素数量:所以每个至少有一个元素的列表将给出True。
要回答你的问题,有很多方法可以做到这一点,但所有这些方法都需要至少部分行走。如果你确定你的列表不包含0
或空字符串,你可以做一些简单的事情:
say so [&&] (1,Any,3); # False
say so [&&] (1,2,3); # True
[&&]
基本上是在说:1 && Any && 3
和1 && 2 && 3
。
如果你不能确定,那么你将不得不做一个额外的步骤:
say [&&] (1,Any,3).map: *.defined; # False
say [&&] (1,0,3).map: *.defined; # True
请注意,在这种情况下,您不必执行so
,因为.map
已经使值为True
或False
。我将它作为练习让读者用.first
做更快的事情。