在Rust中什么时候使用as_* 与to_* 与into_*?

5n0oy7gb  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(239)

基于标准库示例,我的理解是:
into_约定用于函数完全吸收所有权并吐出另一个类型的情况,如into_iter()。理解正确吗?
真实的的混淆是在as_to_之间。
to_看起来像是to_owned()中的to_,它接受类型的引用并派生一个新的相关类型(类似于类型强制),而to_string()接受类型的引用并派生一个新类型(类似于类型转换)。
但是as_as_ptr一样,看起来也像类型强制,除了as_ptras_mut之外,我找不到任何这样的例子。
有没有人能准确地解释一下我们需要使用特定命名约定的情况,并给出一个超出标准库使用范围的真实的例子?

zbdgwd5y

zbdgwd5y1#

Rust API Guidelines的Naming一节包含了对“转换”方法的建议,并显示了一个方便的表格:
| 首码|成本费用|所有权|
| - -|- -|- -|
| as_|免费|借用-〉借用|
| to_|昂贵|借用-〉借用借用-〉拥有(非拷贝类型)拥有-〉拥有(复制类型)|
| into_|变量|owned -〉owned(非拷贝类型)|
这些指导原则继续介绍str::as_bytes()str::to_lowercase()String::into_bytes()等示例,以及其他一些关于抽象和可变性的考虑。
更快的思考方式:

  • 如果它使用数据,则使用into_*
  • 如果它返回数据的另一个“视图”,则使用as_*
  • 否则使用to_*

标准库和大多数生态系统板条箱都遵循这些规则。尽管如此,这些规则更多的是 * 指导方针 * 而不是实际规则。惯例是有帮助的,但不需要严格遵守。

相关问题