我刚看了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)
的语法吗?
答案 0 :(得分:3)
(y) => () => renderLine(y)
是一个返回函数的函数。如果您在没有=>
简写的情况下编写它,则它与:
(y) {
return () {
return renderLine(y);
};
}
这意味着List.generate
调用此函数100次,y
的值不同。每次调用都会返回一个函数,该函数将使用不同的值调用renderLine
。
这将生成一个函数列表(每个函数都采用零参数)。
该列表是Parallel.run
的参数。
因此,代码只是使用快速的内联方式来创建列表,但它等同于:
var tempList = [];
for (int y = 0; y < 100; y++) tempList.add(() => renderLine(y));
Parallel.run(tempList);
Parallel.run
函数需要一个函数列表,并且将并行运行函数,因此您可以并行执行100次renderLine
调用,每次调用都有不同的参数。
答案 1 :(得分:0)
(y) => () => renderLine()
是一个函数,它作为第二个参数传递给Parallel.run()
,这个函数接受一个参数并返回一个不带任何参数的函数。
我不知道为什么这样做。
(x, y) => x + y;
只是(x, y) { return x + y; }
答案 2 :(得分:0)
我猜测(尚未观看视频)Parallel.run()
函数接收并行运行的无参数函数列表(或可迭代)。 List.generate()
构造函数采用int
(长度)和函数(以int
作为参数)并通过调用每个int
的函数来生成那么多项。范围0 .. n-1
。因此,代码new List.generate(100, (y) => renderLine(y))
会生成包含100个项目的List
,每个项目都是在每个索引上调用renderLine()
的结果(即renderLine(0), renderLine(1), ... , renderLine(99)
)。
代码new List.generate(100, (y) => () => renderLine(y))
返回一个包含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))
类似的操作,除非是并行而不是顺序。