我想将一个字符串拆分成单词并将每个单词打印在一个单独的行上,所以我尝试了以下内容:
"foo bar baz".words>>.say
然而,结果不是按顺序排列:
baz
foo
bar
这有什么问题?
答案 0 :(得分:4)
引用design docs,
hyperoperator是您可以向优化器承诺您的代码可以并行化的方法之一。
其他方法是hyper
和race
,我认为这些方法都不会在Rakudo中实施。
如果您关心评估顺序,请使用for
循环,map
或.map
代替超级运算符,例如
"foo bar baz".words.map(&say)
使用say
的方法形式直接等效原始代码将会读取
"foo bar baz".words.map(*.say)
答案 1 :(得分:4)
Hyperoperators实际上确实按顺序返回结果。你的代码的问题是hyperops不是循环结构;他们是列表运营商。因此,他们的执行顺序无法保证,并且使用它们的代码不正确。如果你关心执行顺序,你应该使用像for
这样的结构来保证它。
例如,这个
my @a = "foo bar baz".words>>.split("a");
无论每个元素的计算顺序如何,都会导致@a
包含您期望的元素:
foo b r b z
答案 2 :(得分:1)
当给出一个简单的列表时,允许hyperoperator以任何顺序处理元素。此属性有助于并行化。
如果您只想按顺序对数组的每个元素执行操作,请使用for
,而不是:
for "foo bar baz".words { .say }
打印您要查找的内容:
foo
bar
baz
我把执行和任务混为一谈。请参阅darch更正确(和接受)的答案。