Skip to content

向量

在Sway中的向量示例

sway
contract;

use std::{storage::StorageVec};

// storage vector, heap

abi MyContract {
    #[storage(read, write)]
    fn storage_vec_examples();
    fn heap_vec_examples();
}

storage {
    nums: StorageVec<u64> = StorageVec {},
}

impl MyContract for Contract {
    #[storage(read, write)]
    fn storage_vec_examples() {
        // push - 添加元素
        // pop - 弹出最后一个元素
        // get - 获取元素
        // set - 设置元素
        // remove - 移除元素,并将后续元素向前移动
        // swap remove - 移除指定元素,并将最后一个元素移动到指定位置
        // len - 获取向量长度
        // clear - 清空向量
        // loop - 循环示例

        // push - 添加元素
        storage.nums.push(100);
        storage.nums.push(200);
        storage.nums.push(300);
        storage.nums.push(400);
        storage.nums.push(500);
        storage.nums.push(600);

        // pop - 弹出最后一个元素 - 返回 Option<u64>
        let last = storage.nums.pop();

        // get - 获取元素
        let first = storage.nums.get(0).unwrap();
        let none = storage.nums.get(1000);

        // set - 设置元素
        storage.nums.set(0, 123);

        // remove - 移除元素 - 返回被移除的值
        // 移除前 [100, 200, 300, 400]
        // 移除后 [100, 300, 400]
        let removed_val = storage.nums.remove(1);

        // swap remove - 移除指定元素,并将最后一个元素移动到指定位置
        // 移除前 [100, 300, 400, 500]
        // 移除后 [100, 500, 400]
        storage.nums.swap_remove(1);

        let len = storage.nums.len();

        // clear - 清空向量
        storage.nums.clear();

        // Loop example - 循环示例
        let mut i = 0;
        while i < len {
            let val = storage.nums.get(i).unwrap();
            i += 1;
        }
    }

    fn heap_vec_examples() {
        // new - 创建一个新的向量
        // push - 添加元素
        // pop - 弹出最后一个元素
        // remove - 移除元素
        // get - 获取元素
        // set - 设置元素
        // len - 获取向量长度
        let mut v: Vec<u64> = Vec::new();

        v.push(100);
        v.push(200);
        v.push(300);
        v.push(400);
        v.push(500);

        // 返回 Option<u64>
        v.pop();

        // 移除前 [100, 200, 300, 400]
        // 移除后 [100, 300, 400]
        // 返回被移除的元素
        v.remove(1);

        let val = v.get(1).unwrap();

        v.set(1, val + 1);

        let len = v.len();
    }
}