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

etc*_*tch 5 rust

我正在阅读问题The Trait `std::fmt::Write` is not Implemented for `Stdout` ,而它应该是提问者指出的地方,rust 文档显示 std::io::Write 特征是为两者实现的&Stdout标准输出

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

Sil*_*olo 2

您定义的所有内容不是Thing总是为 实现吗&Thing

不,类型的实现T不会自动实现&T. 现在,有时可以启动一揽子实现,如果您将 a 传递&&T给需要 a 的函数&T,那么 Rust 将为您插入取消引用,但这并不意味着该特征是为 实现的&T,只是 Rust 帮助了您一点。

为什么你要实现某些东西&Thing而不实现它的定义?

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

impl From<&str> for String {
  fn from(value: &str) -> String {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

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