为什么 Rust 标准库同时实现了 Thing 和 &Thing 的特征?

  • 本文关键字:Thing 特征 实现 Rust 标准 rust
  • 更新时间 :
  • 英文 :


我正在阅读这个问题特质' std::fmt::Write '没有为' Stdout '实现,当它应该在提问者注意到rust文档显示std::io::Write特质是为&Stdout和Stdout实现的时候。

我不明白为什么这是必要的,或者你会如何使用它。您为Thing定义的所有内容不总是为&Thing实现吗?为什么你要为&Thing实现一些东西而不实现它的定义?

您为Thing定义的所有内容是否总是为&Thing实现?

不,T类型的实现将自动实现&T。现在,有时可以使用毯子实现,如果您将&&T传递给期望&T的函数,那么Rust将为您插入解引用,但这并不意味着该特性是为&T实现的,只是Rust帮助了您一点。

为什么你要实现&Thing的东西没有实现它的定义?

有一个我们一直在使用的很好的例子:String::from.

impl From<&str> for String {
fn from(value: &str) -> String {
...
}
}

From::<T>::from按值接受一个实参。没有引用或任何东西,只是直接使用类型为T的值。因此,我们永远不能为任何编写From<str>实现,因为str是未大小的,因此不能单独作为函数参数。但是将&str转换为String是完全有意义的:这只是创建字符串的自有副本。

基于@Silvio-Mayolo的回答:在这种特殊情况下,最初只是Stdout的实现;更灵活的&Stdout实现是后来添加的,它提供了严格的功能超集,特别是允许在线程之间共享引用。如果不破坏使用按值实现的现有代码的向后兼容性,就不能删除原始实现(auto-deref并不完美,在某些情况下,您仍然需要返回并添加&)。

最新更新