2.23. 推导式

推导式是简洁的符号结构,旨在允许使用其他序列构建序列。

语法的灵感来自 for 循环的语法:

comprehension ::= array_comprehension | iterator_comprehension | table_comprehension
array_comprehension ::= [ any_comprehension ]
table_comprehension ::= { any_comprehension }
iterator_comprehension := [iterator array_comprehension ]]
any_comprehension ::= for '('' argument_list in source_list ')'; result { ; where optional_clause }
argument_list ::= argument | argument_list ',' argument
source_list ::= iterable_expression | source_list ',' iterable_expression

推导式生成迭代器或动态数组,具体取决于括号的样式:

var a1 <- [iterator for(x in range(0,10)); x]   // iterator<int>
var a2 <- [for(x in range(0,10)); x]            // array<int>
var at1 <- {for(x in range(0,10)); x}           // table<int>
var at2 <- {for(x in range(0,10)); x=>"{x}"}    // table<int;string>

``where``子句充当过滤器:

var a3 <- [for(x in range(0,10)); x; where (x & 1) == 1]   // 只有奇数

就像 for 循环一样,推导式可以迭代多个源:

var a4 <- [for(x,y in range(0,10),a1); x + y; where x==y] // 多个变量

迭代器推导式可能会产生一个引用的迭代器:

var a = [1,2,3,4]
var b <- [iterator for(x in a); a]  // iterator<int&> 的 API 中,并将指向捕获的元素副本

常规 lambda 捕获规则适用于迭代器推导式 (参阅 Lambdas).

在内部,数组推导产生一个本地块的 invoke 和一个 for 循环;而迭代器推导式生成生成器 (lambda)。 数组推导式通常更快,但迭代器推导式的内存占用较少。