字符串 - String

字符串在 Move 中并不严格是原始类型,而是作为标准库中的一个模块实现的。字符串不同于其他结构,它们得到了虚拟机 (VM) 和 API 的大量支持。 字符串可以直接作为交易参数传递,通过 SDK 传递,并且在后台会被正确地序列化/反序列化为 String 结构。

Move 中的函数可以直接接受 String 参数:

public fun do_something(s: String) {
    // ...
}

在 Move 中,由于字符串不是原始类型,它没有直接的字面量语法。相反,你可以使用 string 模块中的 utf8 函数来创建字符串:

let s = std::string::utf8(b"Hello, World!");

b"Hello, World!" 是一个字节数组字面量 (vector),utf8 函数将其转换为字符串。如果字节数组不是有效的 UTF-8 字符串,utf8 函数会出错。

字符串不能直接作为常量设置,因为常量表达式不支持函数调用。你需要先将字节值赋给常量,然后再将其转换为字符串:

const HELLO_WORLD: vector<u8> = b"Hello, World!";
public fun hello_world(): String {
    std::string::utf8(HELLO_WORLD)
}

这将创建一个 UTF-8 字符串。

Move 还支持 ASCII 字符串,这是一个不同的模块:

let s = std::ascii::from_asciistring(b"Hello, World!");

然而,UTF-8 字符串更常用,ASCII 字符串则较为罕见。

字符串是可变的。你还可以将字符串连接在一起:

let s1 = std::string::utf8(b"Hello, ");
let s2 = std::string::utf8(b"World!");
std::string::append(&mut s1, s2);

或取子字符串:

let s = std::string::utf8(b"Hello, World!");
let sub = std::string::sub_string(&s, 0, 5);

你也可以在特定索引处插入字符串:

let s = std::string::utf8(b"Hello, World!");
let s2 = std::string::utf8(b"Brave ");
std::string::insert(&mut s, 7, s2);

你还可以找到子字符串的索引:

let s = std::string::utf8(b"Hello, World!");
let s2 = std::string::utf8(b"World");
let index = std::string::index_of(&s, &s2);