sui-move进阶:vector0x1::vector是SuiMove中提供的动态数组模块,用于管理可变大小的容器。向量支持任意类型的存储,具有灵活的增删查改功能,底层实现采用原生操作以确保高效性。如果是学过Rust的朋友,应该对Vector不陌生,但Move的vector仍然与Rus
0x1::vector
是 Sui Move 中提供的动态数组模块,用于管理可变大小的容器。向量支持任意类型的存储,具有灵活的增删查改功能,底层实现采用原生操作以确保高效性。
如果是学过Rust的朋友,应该对Vector不陌生,但Move的vector仍然与Rust中有差异,尤其它的方法接口是需要特别学习一下的。
0
开始。常量名称 | 错误码 | 描述 |
---|---|---|
EINDEX_OUT_OF_BOUNDS |
131072 | 索引越界错误。 |
以下是 vector
模块的主要功能,分为创建、查询、修改和高级操作四类。
public fun empty<Element>(): vector<Element>
创建一个空向量。
示例:
let v = vector::empty<u64>();
public fun singleton<Element>(e: Element): vector<Element>
返回一个仅包含单个元素的向量。
示例:
let v = vector::singleton(42);
public fun length<Element>(v: &vector<Element>): u64
返回向量的长度。
示例:
let len = vector::length(&v);
public fun is_empty<Element>(v: &vector<Element>): bool
如果向量为空,返回 true,否则返回 false。
示例:
let empty = vector::is_empty(&v);
public fun contains<Element>(v: &vector<Element>, e: &Element): bool
检查指定元素是否在向量中。
示例:
let exists = vector::contains(&v, &42);
public fun index_of<Element>(v: &vector<Element>, e: &Element): (bool, u64)
返回指定元素的索引(如果存在)。
示例:
let (found, idx) = vector::index_of(&v, &42);
public fun borrow<Element>(v: &vector<Element>, i: u64): &Element
示例:
let val = vector::borrow(&v, 0);
public fun borrow_mut<Element>(v: &mut vector<Element>, i: u64): &mut Element
示例:
let val_mut = vector::borrow_mut(&mut v, 0);
*val_mut = 100;
public fun push_back<Element>(v: &mut vector<Element>, e: Element)
在向量末尾添加一个元素。
示例:
vector::push_back(&mut v, 42);
public fun pop_back<Element>(v: &mut vector<Element>): Element
移除并返回向量末尾的元素。
示例:
let last = vector::pop_back(&mut v);
public fun remove<Element>(v: &mut vector<Element>, i: u64): Element\
示例:
let removed = vector::remove(&mut v, 1);
public fun swap_remove<Element>(v: &mut vector<Element>, i: u64): Element
示例:
let removed = vector::swap_remove(&mut v, 1);
public fun insert<Element>(v: &mut vector<Element>, e: Element, i: u64)
在指定位置插入元素。
示例:
vector::insert(&mut v, 42, 1);
public fun swap<Element>(v: &mut vector<Element>, i: u64, j: u64)
交换向量中两个位置的元素。
示例:
vector::swap(&mut v, 0, 1);
public fun reverse<Element>(v: &mut vector<Element>)
原地反转向量中的元素顺序。
示例:
vector::reverse(&mut v);
public fun append<Element>(lhs: &mut vector<Element>, other: vector<Element>)
将另一个向量的所有元素追加到当前向量。
示例:
vector::append(&mut v, other_v);
public fun flatten<T>(v: vector<vector<T>>): vector<T>
将嵌套向量展平为单个向量。
示例:
let flat = vector::flatten(nested_v);
public fun destroy_empty<Element>(v: vector<Element>)
销毁一个空向量。如果向量不为空,则中止。
示例:
vector::destroy_empty(v);
以下示例展示了 vector 模块的常见操作:
module example::vector_usage {
public fun main() {
// 创建一个空向量
let mut v = vector::empty<u64>();
// 添加元素
vector::push_back(&mut v, 10);
vector::push_back(&mut v, 20);
// 查询操作
let len = vector::length(&v);
let contains_10 = vector::contains(&v, &10);
// 修改操作
vector::swap(&mut v, 0, 1);
let popped = vector::pop_back(&mut v);
// 高级操作
vector::reverse(&mut v);
// 销毁向量
vector::destroy_empty(v);
}
}
0x1::vector 是一个功能强大的动态数组模块,提供了丰富的操作接口:
该库位于0x1中,是Sui Move最根本的功能之一。
但说实在的,对于这种很底层的库,目前而言我们也只需要记住它的接口就行了,甚至记不住也没关系————反正还能查嘛!
活用网络,不要当死板的coder。
不要逼自己去背,没用,多写就记住了。
(说白了难道我在这里教你,我便全将它记住了吗?不存在的)
噢,对了,记得通过接口的英文意思去推断它的功能,这往往是对的,标准库的程序员并没有防御性编程的习惯。
再不济还有编译器呢(笑)
已经介绍过了table
,在下一节,我将进行vec_map
的介绍,探讨Sui Move中另一种表(不是说只有这两种)的内容和用法。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!