我正在阅读这个问题特质' 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并不完美,在某些情况下,您仍然需要返回并添加&
)。