如何按原始顺序从超级运算符中获取元素?
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.
其他方法是 hyper
和 race
,我认为在 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
我想将一个字符串拆分成单词并在单独的行上打印每个单词,所以我尝试了以下操作:
"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.
其他方法是 hyper
和 race
,我认为在 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