如何按原始顺序从超级运算符中获取元素?

How do I get elements out of a hyperoperator in the original order?

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

"foo bar baz".words>>.say

但是,结果不符合顺序:

baz
foo
bar

这有什么问题?

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

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

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

打印您要查找的内容:

foo
bar
baz

更新

我把执行和赋值混为一谈了。请参阅 darch 的更正确(并被接受)的答案。

引用design docs,

A hyperoperator is one of the ways that you can promise to the optimizer that your code is parallelizable.

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

如果您确实关心评估顺序,请使用 for 循环,map.map 而不是超级运算符,例如

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

使用 say 方法形式的原始代码的直接等效形式为

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

超级运营商实际上 return 按顺序处理结果。您的代码的问题是 hyperops 不是循环结构;他们是列表运算符。因此,它们的 execution 顺序无法保证,并且使用它们的代码就好像它们是不正确的一样。如果你关心执行顺序,你应该使用像 for 这样的结构来保证它。

例如,这个

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

结果 @a 包含您期望的顺序的元素,而不考虑每个元素的计算顺序:

foo b r b z