结点~~结点行为

Paw*_*bkr 8 raku

我想检查数组的所有元素是否都给定了类型。

$ 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
Run Code Online (Sandbox Code Playgroud)

到目前为止按预期工作。现在我想允许两种类型:

$ raku -e 'my @t = 1,2,3,"a"; say all(@t) ~~ Int|Str'
False
Run Code Online (Sandbox Code Playgroud)

为什么会这样?如果1 ~~ Int|StrTrue单个元素,为什么all()元素连接失败?

顺便说一句:这个问题是关于理解Junction ~~ Junction行为(这也有点没有记录),而不是关于从示例中执行检查的替代方法(我知道这是可能的)。

cod*_*ons 7

一些额外的行可能有助于澄清发生了什么:

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»
Run Code Online (Sandbox Code Playgroud)

也就是说,all(1, 2, 'c') ~~ Int|Str是在问“是所有的1, 2, 'c'都是Ints 的情况,还是所有的1, 2, 'c'都是Strs 的情况?” 由于这两种情况都不是,它返回False

  • 顺便说一句:我找到了避免 grep 的优雅解决方案:`all(@t) ~~subset :: where Int|Str;`。 (3认同)
  • @PawelPabianbbkr 我没有提供替代方案,因为你说你对一个不感兴趣,但我个人更喜欢 `all @t.map(* ~~ Int|Str)` 到 `subset` 方法。但两者都有效。 (2认同)