Iterator 和 Sequence
Vela 在数组、map、set、range、string 和宿主返回的 iterable 上使用同一套迭代模型。这个模型区分可重复来源和 one-shot cursor。
Iterable、Sequence、Iterator
Section titled “Iterable、Sequence、Iterator”Iterable 可以创建或提供 iterator。Sequence 是可重复 iterable,每次遍历都会创建新的 iterator。Iterator 是 one-shot cursor;next() 会推进同一个状态,后续调用能观察到推进后的结果。
fn first_two(values) { let iter = values.iter() let first = iter.next() let second = iter.next() return [first, second]}For-In
Section titled “For-In”for value in source 会先求值 source,取得 iterator,然后推进直到结束。
for index, value in source 会同时把从 0 开始的位置和当前值交给循环体。
Map 循环会产生 MapEntry { key, value } record。只需要 value 时使用
map.values(),只需要 key 时使用 map.keys()。
fn total(values) -> i64 { let sum = 0 for index, value in values { sum += value + index } return sum}map、filter、take、skip 等方法是 lazy 且 one-shot 的。count、any、all、find、collect_array 等终端方法会消费 cursor。
fn active_codes(items) { return items.iter() .filter(|item| item.active) .map(|item| item.code) .collect_array()}宿主 Iterable
Section titled “宿主 Iterable”宿主可以返回 snapshot iterable,但宿主拥有的状态不会被放到脚本 GC 下。后续宿主修改仍然需要 HostAccess 或显式 native function 边界。