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