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)。
数组推导式通常更快,但迭代器推导式的内存占用较少。