Parallel.run 语法

Parallel.run syntax

刚看完this introduction from the Dart Summit。讲的时候放了这段代码:

=> new List.generate(100, (y) => renderLine(y));

我很确定我理解那句话。箭头功能对我来说是新的,但没关系——它看起来有点像咖啡。不过,重点是将此函数并行更改为 运行,这样做是这样的:

=> Parallel.run(new List.generate(100, (y) => () => renderLine(y)));

谁能解释一下 (y) => () => renderLine(y) 的语法?

(y) => () => renderLine() 是一个作为第二个参数传递给 Parallel.run() 的函数,这个函数有一个参数,returns 一个没有任何参数的函数。

不知道为什么要这样。

(x, y) => x + y; 只是 (x, y) { return x + y; }

的 shorthand

(y) => () => renderLine(y)是一个函数,returns是一个函数。如果不写=> shorthand,则等同于:

(y) {
  return () {
    return renderLine(y);
  };
}

这意味着 List.generate 调用此函数 100 次,y 的值不同。每次调用 returns 一个函数,该函数将使用不同的值调用 renderLine

这会生成一个 函数列表 (每个函数都采用零参数)。 该列表是 Parallel.run.

的参数

因此,代码只是使用一种快速的内联方式来创建列表,但它等效于:

var tempList = [];
for (int y = 0; y < 100; y++) tempList.add(() => renderLine(y));
Parallel.run(tempList);

Parallel.run 函数需要一个函数列表,并将 运行 函数并行执行,因此您可以并行执行 100 次对 renderLine 的调用,每个调用都有不同的参数.

我猜(没看过视频)Parallel.run() 函数并行接收到 运行 的无参数函数列表(或可迭代的)。 List.generate() 构造函数接受一个 int(长度)和一个函数(接受一个 int 作为参数)并通过为每个 int 调用该函数来生成那么多项目范围 0 .. n-1。所以代码 new List.generate(100, (y) => renderLine(y)) 生成了一个 List 的 100 项,每一项都是对每个索引(即 renderLine(0), renderLine(1), ... , renderLine(99))调用 renderLine() 的结果。

代码 new List.generate(100, (y) => () => renderLine(y)) returns 一个包含 100 个项目的列表,其中的 aech 是一个不带参数的函数,调用时调用 renderLine() 并在列表。即列表为:() => renderLine(0), () => renderLine(1), () => renderLine(2), ..., () => renderLine(99).

我猜 Parallel.run() 然后 运行 并行执行所有这些函数,也许将结果汇总到列表中并返回?如果是这样,那么代码 Parallel.run(new List.generate(100, (y) => () => renderLine(y))) 会做类似于 new List.generate(100, (y) => () => renderLine(y)) 的事情,除了并行而不是顺序。