3

我想将字符串拆分为单词并将每个单词打印在单独的行上,因此我尝试了以下操作:

"foo bar baz".words>>.say

然而,结果并没有按顺序排列:

baz
foo
bar

这有什么问题?

4

3 回答 3

5

超级运算符实际上确实按顺序返回结果。您的代码的问题是超操作不是循环构造;他们是列表运算符。因此,不能保证它们的执行顺序,并且使用它们的代码好像是不正确的。如果您关心执行顺序,您应该使用这样的构造for来保证它。

例如,这个

my @a = "foo bar baz".words>>.split("a");

无论计算@a每个元素的顺序如何,都会以您期望的顺序包含元素:

foo b r b z
于 2015-04-18T07:18:19.510 回答
4

引用设计文档

超算子是您可以向优化器承诺您的代码可并行化的方式之一。

其他方法是hyperand race,我认为 Rakudo 中没有实现。

如果您确实关心评估顺序,请使用 aafor循环,map或者.map代替超级运算符,例如

"foo bar baz".words.map(&say)

使用方法形式的原始代码的直接等价物say将读取

"foo bar baz".words.map(*.say)
于 2015-04-17T21:23:02.653 回答
1

当给定一个简单的列表时,允许超算子以任何顺序处理元素。此属性有助于并行化。

如果您只是想对数组的每个元素进行操作,请按顺序使用for,而不是:

for "foo bar baz".words { .say }

打印您要查找的内容:

foo
bar
baz

更新

我将执行和分配混为一谈。请参阅 darch 更正确(和接受)的答案。

于 2015-04-17T14:10:33.313 回答