结点~~结点行为
我想检查数组的所有元素是否都给定了类型。
$ raku -e 'my @t = 1,2,3; say all(@t) ~~ Int'
True
$ raku -e 'my @t = 1,2,3,"a"; say all(@t) ~~ Int'
False
到目前为止按预期工作。现在我想允许两种类型:
$ raku -e 'my @t = 1,2,3,"a"; say all(@t) ~~ Int|Str'
False
为什么会这样?如果1 ~~ Int|Str是True单个元素,为什么all()元素连接失败?
顺便说一句:这个问题是关于理解Junction ~~ Junction行为(这也有点没有记录),而不是关于从示例中执行检查的替代方法(我知道这是可能的)。
回答
一些额外的行可能有助于澄清发生了什么:
say all(1, 2, 3) ~~ Int|Str; # OUTPUT: «True»
say all('a', 'b', 'c') ~~ Int|Str; # OUTPUT: «True»
say all(1, 2, 'c') ~~ Int|Str; # OUTPUT: «False»
也就是说,all(1, 2, 'c') ~~ Int|Str是在问“是所有的1, 2, 'c'都是Ints 的情况,还是所有的1, 2, 'c'都是Strs 的情况?” 由于这两种情况都不是,它返回False。
- 顺便说一句:我找到了避免 grep 的优雅解决方案:`all(@t) ~~subset :: where Int|Str;`。
- @PawelPabianbbkr 我没有提供替代方案,因为你说你对一个不感兴趣,但我个人更喜欢 `all @t.map(* ~~ Int|Str)` 到 `subset` 方法。但两者都有效。