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

man*_*nth 16 naming-conventions rust

根据标准库示例,我的理解是:

into_当函数完全吸收所有权并吐出另一种类型时,使用约定,如 中所示into_iter()。理解正确吗?

真正的混乱在于as_和之间to_
似乎to_into_owned()接受类型的引用并吐出一个新的相关类型(如类型强制),而 asto_string()接受类型的引用并吐出一个新类型(如类型转换)。

as_似乎as_ptr也像类型强制。as_ptr除了或 之外,我找不到任何例子as_mut

有人可以准确解释我们需要使用特定命名约定的情况以及超出标准库中使用的现实生活示例吗?

kmd*_*eko 19

Rust API 指南中有一个命名部分,其中包括“转换”方法的建议并显示了一个方便的表格:

字首 成本 所有权
as_ 自由的 借来 -> 借来
to_ 昂贵的 借用 -> 借用
借用 -> 拥有(非复制类型)
拥有 -> 拥有(复制类型)
into_ 多变的 拥有 -> 拥有(非复制类型)

该指南继续提供了诸如str::as_bytes()str::to_lowercase()String::into_bytes()等示例以及抽象和可变性的一些其他注意事项。

一种更快的思考方式:

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

标准库和大多数生态系统包几乎都遵循这些规则。与往常一样,这些更多的是指导方针,而不是实际规则。约定很有帮助,但不需要严格遵守。