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))
的事情,除了并行而不是顺序。
刚看完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; }
(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))
的事情,除了并行而不是顺序。