我正在阅读问题The trait `std::fmt::Write` is not implemented for `Stdout` when it should be,其中发问者注意到Ruust文档显示,&Stdout和Stdout都实现了std::IO::WRITE特征.
我不明白为什么这是必要的,也不明白你会如何使用它.您为Thing
定义的所有内容不都是为&Thing
实现的吗?为什么要为&Thing
实现一些东西,而不实现它的定义呢?
我正在阅读问题The trait `std::fmt::Write` is not implemented for `Stdout` when it should be,其中发问者注意到Ruust文档显示,&Stdout和Stdout都实现了std::IO::WRITE特征.
我不明白为什么这是必要的,也不明白你会如何使用它.您为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
的值.因此,我们永远不能为anything编写From<str>
实现,因为str
没有大小,因此不能单独作为函数参数.但将&str
转换为String
是完全有意义的:这只是制作字符串的自己的副本.