You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sui Move中如何获取Bag集合的全部元素列表?

在Sui Move中获取Bag集合的全部元素列表

Sui Move的原生Bag确实没有提供keys()或values()这类遍历方法——这是因为Move的设计着重于资源安全和性能,避免无限制遍历可能带来的开销。不过你可以通过以下几种方案实现需求:

方案1:同步维护一个键列表

每次向Bag添加元素时,同时把键存入一个额外的Vec中。需要获取全部元素时,遍历这个Vec,再通过bag::get()取出对应的值。

示例代码:

use sui::bag::Bag;
use sui::vec::Vec;

// 自定义集合结构体,同时持有Bag和键列表
struct MyCollection has key {
    bag: Bag<u64, String>,
    keys: Vec<u64>,
}

// 向集合添加元素,同步更新Bag和键列表
fun add_element(collection: &mut MyCollection, key: u64, value: String) {
    bag::add(&mut collection.bag, key, value);
    // 注意:如果需要避免重复键,这里可以先检查vec中是否已存在该键
    vec::push(&mut collection.keys, key);
}

// 获取所有元素的值列表
fun get_all_values(collection: &MyCollection): Vec<String> {
    let mut values = vec::empty();
    let keys_len = vec::length(&collection.keys);
    let mut idx = 0;
    while idx < keys_len {
        let key = *vec::borrow(&collection.keys, idx);
        // 因为Bag中可能存在已被删除的键,所以用if let处理
        if let Some(val) = bag::get(&collection.bag, key) {
            vec::push(&mut values, val);
        };
        idx = idx + 1;
    }
    values
}

注意:如果需要支持删除元素,记得同时从keys列表中移除对应的键,否则遍历会拿到无效的键(此时bag::get会返回None)。

方案2:用Vec替代Bag(如果不需要快速查找)

如果你的场景对键值对的查找性能要求不高,直接用Vec<(K, V)>来存储元素会更简单,遍历直接操作Vec即可:

示例代码:

use sui::vec::Vec;

struct MyKVCollection has key {
    items: Vec<(u64, String)>,
}

fun add_element(collection: &mut MyKVCollection, key: u64, value: String) {
    // 如需去重,可以先遍历检查是否已有相同键
    vec::push(&mut collection.items, (key, value));
}

// 直接返回所有元素的引用
fun get_all_elements(collection: &MyKVCollection): &Vec<(u64, String)> {
    &collection.items
}

方案3:利用事件辅助(仅用于链上查询)

如果只是需要在链下获取Bag的全部元素,可以在每次添加元素时触发一个事件,链下服务监听事件并维护一份完整的元素列表。这种方式适合不需要在Move合约内部遍历元素的场景。

示例代码:

use sui::bag::Bag;
use sui::event;

struct ElementAdded has copy, drop {
    key: u64,
    value: String,
}

fun add_element(bag: &mut Bag<u64, String>, key: u64, value: String) {
    bag::add(bag, key, value);
    event::emit(ElementAdded { key, value });
}

链下服务可以通过Sui的事件API订阅ElementAdded事件,逐步构建出完整的元素列表。

内容的提问来源于stack exchange,提问作者Ice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 08:02:15