跳转到内容

数组方法

数组是有序的脚本自有集合。标准数组方法覆盖查询、修改、eager 转换和 iterator 创建。集合增长仍然受 VM 执行预算和集合预算检查。

基础查询使用 lenis_emptyfirstlastcontainsindex_ofcontainsindex_of 使用 ValueKey 容器等价规则: 不可变叶子值按值比较,脚本堆对象和 host ref 按 identity 比较。可能找不到值 的方法返回 Option。当查询需要通过 ==/PartialEq 使用业务相等时,使用 findanyfilter 等 predicate helper。

fn main() {
let rewards = ["gold", "xp"];
let first = rewards.first().unwrap_or("none");
let index = rewards.index_of("xp").unwrap_or(-1);
return first.len() + index;
}

修改方法会原地更新数组,并根据操作返回 ()boolOption

fn main() {
let queue = ["spawn"];
queue.push("reward");
queue.insert(1, "combat");
let removed = queue.remove_at(0).unwrap_or("");
return removed + ":" + queue.join(",");
}

slicereversedistinctsortminmaxsumgroup_bysort_by 会立即 materialize 结果。 distinct 同样使用 ValueKey 容器等价规则,不使用语义 PartialEq,也不做深层结构比较。sortsort_by 要求 total-order key;float 会被拒绝,直到 Vela 增加显式 total-float ordering API。 group_by 返回 value-keyed Map<K, Array<T>>,callback key 遵循普通 Map key 相同的 ValueKey 策略。

fn main() {
let scores = [5, 1, 3, 5].distinct().sort();
let best = scores.max().unwrap_or(0);
return best + scores.sum();
}

带 callback 的 helper 会通过 VM 调脚本函数,因此热路径里的 callback 应保持 短小。

fn main() {
return [1, 2, 3, 4]
.filter(|value| value % 2 == 0)
.map(|value| value * value)
.sum();
}

itervalues 产生数组值 iterator。Iterator 方法包括 mapfiltertakeskipfindanyallcountcollect_arraycollect_set

fn main() {
let names = ["wolf", "boar", "wyrm"];
return names.iter()
.filter(|name| name.starts_with("w"))
.take(1)
.collect_array()
.join(",");
}