我在Perl 6中看到以下代码:
await do for @files -> $file {
start {
#do something ... }
}
Run Code Online (Sandbox Code Playgroud)
它以异步模式运行.为什么上面的代码需要do?doPerl 6 的目的是什么?有人可以详细解释上面的代码吗?
还有一个选项可以写这样的东西:
for @files -> $file {
start {
#do something ... }
}
Run Code Online (Sandbox Code Playgroud)
并等待承诺履行的代码?
sml*_*mls 10
do该for关键字可以用两种不同的方式使用:
1)作为独立的块声明:
for 1..5 { say $_ }
Run Code Online (Sandbox Code Playgroud)
2)作为附加到语句末尾的语句修饰符:
say $_ for 1..5;
Run Code Online (Sandbox Code Playgroud)
当在for较大的语句中遇到bare 关键字时,它被解释为第二种形式.
如果你想在一个更大的语句中使用块形式(例如作为await函数的参数),你必须在它前面do告诉解析器你在这里开始一个块语句,并希望它的返回值.
更一般地说,do确保使用相同的规则解析它后面的内容,就好像它是自己的语句一样,并使它提供返回值.因此,它允许我们将任何语句用作更大语句中的表达式.do if,do while等所有的工作方式相同.
你展示的代码......
await do for @files -> $file {
start {
#do somthing ... }
}
Run Code Online (Sandbox Code Playgroud)
......执行以下操作:
@files.start关键字来调度异步任务,这可能与当前元素有关$file.($*SCHEDULER变量决定实际如何启动任务;默认情况下,它使用简单的线程池调度程序.)start立即返回一个Promise异步任务完成时将更新的内容.do for收集的循环体(即承诺)的所有返回值的序列.await函数接受此序列作为其参数,并等待所有promise完成.不完全确定你的意思.如果你想记住承诺但不等待它们只是喷射,只需将它们存储在一个数组中:
my @promises = do for @files -> $file {
start {
#do something ... }
}
#other code ...
await @promises;
Run Code Online (Sandbox Code Playgroud)
等待所有预定/运行任务没有便利功能.你总是要跟踪承诺.