[toc]
Module 0x1::string
string 模块定义了表示 UTF8 编码字符串的 String 类型。
use 0x1::option;
use 0x1::vector;结构体 String
一个字符串包含一系列字节,保证是 UTF-8 格式。
struct String has copy, drop, store字段
bytes: vector<u8>常数
索引越界
const EINVALID_INDEX: u64 = 2;无效的 UTF-8 编码
const EINVALID_UTF8: u64 = 1;函数
utf8
从字节序列创建一个新的字符串。如果字节序列不表示有效的 UTF-8,则会中止。
public fun utf8(bytes: vector<u8>): string::String实现
public fun utf8(bytes: vector<u8>): String {
assert!(internal_check_utf8(&bytes), EINVALID_UTF8);
String{bytes}
}try_utf8
尝试从字节序列创建一个新的字符串。
public fun try_utf8(bytes: vector<u8>): option::Option<string::String>实现
public fun try_utf8(bytes: vector<u8>): Option<String> {
if (internal_check_utf8(&bytes)) {
option::some(String{bytes})
} else {
option::none()
}
}bytes
返回底层字节向量的引用。
public fun bytes(s: &string::String): &vector<u8>实现
public fun bytes(s: &String): &vector<u8> {
&s.bytes
}is_empty
检查此字符串是否为空。
public fun is_empty(s: &string::String): bool实现
public fun is_empty(s: &String): bool {
vector::is_empty(&s.bytes)
}length
返回此字符串的长度,以字节为单位。
public fun length(s: &string::String): u64实现
public fun length(s: &String): u64 {
vector::length(&s.bytes)
}append
追加一个字符串。
public fun append(s: &mut string::String, r: string::String)实现
public fun append(s: &mut String, r: String) {
vector::append(&mut s.bytes, r.bytes)
}append_utf8
追加必须为有效 UTF-8 格式的字节。
public fun append_utf8(s: &mut string::String, bytes: vector<u8>)实现
public fun append_utf8(s: &mut String, bytes: vector<u8>) {
append(s, utf8(bytes))
}insert
在给定字符串的字节索引处插入另一个字符串。索引必须位于有效的 UTF-8 字符边界。
public fun insert(s: &mut string::String, at: u64, o: string::String)实现
public fun insert(s: &mut String, at: u64, o: String) {
let bytes = &s.bytes;
assert!(at <= vector::length(bytes) && internal_is_char_boundary(bytes, at), EINVALID_INDEX);
let l = length(s);
let front = sub_string(s, 0, at);
let end = sub_string(s, at, l);
append(&mut front, o);
append(&mut front, end);
*s = front;
}sub_string
使用给定的字节索引返回一个子字符串,其中 i 是第一个字节的位置,j 是不包括的第一个字节的开始(或字符串的长度)。索引必须位于有效的 UTF-8 字符边界,保证结果是有效的 UTF-8。
public fun sub_string(s: &string::String, i: u64, j: u64): string::String实现
public fun sub_string(s: &String, i: u64, j: u64): String {
let bytes = &s.bytes;
let l = vector::length(bytes);
assert!(
j <= l && i <= j && internal_is_char_boundary(bytes, i) && internal_is_char_boundary(bytes, j),
EINVALID_INDEX
);
String { bytes: internal_sub_string(bytes, i, j) }
}index_of
计算字符串第一次出现的索引。如果没有找到出现,则返回 length(s)。
public fun index_of(s: &string::String, r: &string::String): u64实现
public fun index_of(s: &String, r: &String): u64 {
internal_index_of(&s.bytes, &r.bytes)
}internal_check_utf8
public fun internal_check_utf8(v: &vector<u8>): bool实现
public native fun internal_check_utf8(v: &vector<u8>): bool;internal_is_char_boundary
fun internal_is_char_boundary(v: &vector<u8>, i: u64): bool实现
native fun internal_is_char_boundary(v: &vector<u8>, i: u64): bool;internal_sub_string
fun internal_sub_string(v: &vector<u8>, i: u64, j: u64): vector<u8>实现
native fun internal_sub_string(v: &vector<u8>, i: u64, j: u64): vector<u8>;internal_index_of
fun internal_index_of(v: &vector<u8>, r: &vector<u8>): u64实现
native fun internal_index_of(v: &vector<u8>, r: &vector<u8>): u64;规范
internal_check_utf8
public fun internal_check_utf8(v: &vector<u8>): bool特性 opaque;
如果 false,则中止 [abstract] false;
确保 [abstract] 结果 == spec_internal_check_utf8(v);
internal_is_char_boundary
fun internal_is_char_boundary(v: &vector<u8>, i: u64): bool特性 opaque;
如果 false,则中止 [abstract] false;
确保 [abstract] 结果 == spec_internal_is_char_boundary(v, i);
internal_sub_string
fun internal_sub_string(v: &vector<u8>, i: u64, j: u64): vector<u8>特性 opaque;
如果 false,则中止 [abstract] false;
确保 [abstract] 结果 == spec_internal_sub_string(v, i, j);
internal_index_of
fun internal_index_of(v: &vector<u8>, r: &vector<u8>): u64特性 opaque;
如果 false,则中止 [abstract] false;
确保 [abstract] 结果 == spec_internal_index_of(v, r);
规范函数
fun spec_utf8(bytes: vector<u8>): String {
String{bytes}
}fun spec_internal_check_utf8(v: vector<u8>): bool;
fun spec_internal_is_char_boundary(v: vector<u8>, i: u64): bool;
fun spec_internal_sub_string(v: vector<u8>, i: u64, j: u64): vector<u8>;
fun spec_internal_index_of(v: vector<u8>, r: vector<u8>): u64;