Rust中的命名约定(或API设计模式)通常与函数或方法的行为紧密相关,总结了标准库中常见的命名约定,这帮助使用者理解代码的含义而不必深入查看实现细节。根据最小惊讶原则,在你项目的API也应该遵守这些约定。
以下总结了10个Rust中常见的命名约定:
into_*
通常表示该方法会消耗(Take ownership)调用者,并返回一个新的值。比如,into_string会把调用者转换成一个String类型。
let string = "hello".to_string();
let bylet number = 10;
let string_number = number.to_string(); // 将数字转换为 Stringtes = string.into_bytes(); // 将 String 转换成 Vec<u8>
to_*
通常表示转换,但不同于into_*方法,to_*一般不会提供所有权转移,而是返回一个转换后的值的副本。比如,to_vec通常会复制内容到一个新的Vec。
let number = 10;
let string_number = number.to_string(); // 将数字转换为 String
as_*
通常表示转换为另一种类型但不是所有权转移,即通过引用转换。比如,as_str 从String类型获得一个&str类型的切片。
let string = "hello".to_string();
let str_slice = string.as_str(); // 将 String 借用为 &str
is_*
用于返回布尔值的方法,表示某种条件或特性是否成立。如is_empty 用来判断容器是否为空。
let string = "hello".to_string();
let is_empty = string.is_empty(); // 检查字符串是否为空
from_*
通常指关联函数(也称为静态方法)用于构造一个类型的实例,它表示从某些参数构造该类型的新实例。例如,FromStr::from_str尝试从一个字符串切片中构造出具体的类型。
let num_str = "42";
// 从字符串解析一个 i32 类型的数字
let num = i32::from_str_radix(num_str, 10).unwrap();
try_*
表示可能会失败的操作,通常返回Result类型。例如,try_into是into的Error发生版本。
let num_str = "42";
// 堆代码 duidaima.com
// try_from 的变体,尝试将字符串解析为 i32 类型
let result = num_str.parse::<i32>();
new
通常用于构造函数,表明可以创建该类型的新实例。
let mut vec = Vec::new(); // 创建一个新的空 Vec<T>
with_*
这通常表示某个构造函数或工厂方法,它提供了比new更多的初始化定制选项。
let mut vec = Vec::with_capacity(10);
unchecked_*
表示一个函数执行了没有进行严格安全检查的操作,使用它们需要非常小心,确保满足所有安全条件,因为它们可能不保证类型安全或内存安全。
// 但是, 你可以在数组中看到类似的不安全方法:
unsafe {
let x: [u8; 5] = [1, 2, 3, 4, 5];
let y: u8 = *x.get_unchecked(2); // 使用 get_unchecked 来获取数组中的元素,跳过越界检查
}
expect_*
类似unwrap,但在出现错误时提供更具描述性的错误信息。
let some_value = Some("Rust");
// 如果 Some 是 None,这将触发 panic,并显示提供的错误信息
let value = some_value.expect("Value should be present");