基于标准库示例,我的理解是:into_
约定用于函数完全吸收所有权并吐出另一个类型的情况,如into_iter()
。理解正确吗?
真实的的混淆是在as_
和to_
之间。to_
看起来像是to_owned()
中的to_
,它接受类型的引用并派生一个新的相关类型(类似于类型强制),而to_string()
接受类型的引用并派生一个新类型(类似于类型转换)。
但是as_
和as_ptr
一样,看起来也像类型强制,除了as_ptr
或as_mut
之外,我找不到任何这样的例子。
有没有人能准确地解释一下我们需要使用特定命名约定的情况,并给出一个超出标准库使用范围的真实的例子?
1条答案
按热度按时间zbdgwd5y1#
Rust API Guidelines的Naming一节包含了对“转换”方法的建议,并显示了一个方便的表格:
| 首码|成本费用|所有权|
| - -|- -|- -|
|
as_
|免费|借用-〉借用||
to_
|昂贵|借用-〉借用借用-〉拥有(非拷贝类型)拥有-〉拥有(复制类型)||
into_
|变量|owned -〉owned(非拷贝类型)|这些指导原则继续介绍
str::as_bytes()
、str::to_lowercase()
、String::into_bytes()
等示例,以及其他一些关于抽象和可变性的考虑。更快的思考方式:
into_*
as_*
to_*
标准库和大多数生态系统板条箱都遵循这些规则。尽管如此,这些规则更多的是 * 指导方针 * 而不是实际规则。惯例是有帮助的,但不需要严格遵守。