我正在阅读问题The trait `std::fmt::Write` is not implemented for `Stdout` when it should be,其中发问者注意到Ruust文档显示,&StdoutStdout都实现了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是完全有意义的:这只是制作字符串的自己的副本.

Rust相关问答推荐

程序退出后只写入指定管道的数据

值为可变对象的不可变HashMap

在决定使用std::Sync::Mutex还是使用Tokio::Sync::Mutex时,操作系统线程调度是考虑因素吗?

无法定义名为&new&的关联函数,该函数的第一个参数不是self

在本例中,为什么我不能一次多次borrow 可变变量?

对于已经被认为是未定义行为的相同数据,纯粹存在`&;[u32]`和`&;mut[u32]`吗?

在Rust中,Box:ed struct 与普通 struct 在删除顺序上有区别吗?

从管道读取后重置标准输入

Rust:为什么 &str 不使用 Into

带引脚和不带引脚的比较功能

一次不能多次borrow *obj作为可变对象

实现AsyncWrite到hyper Sender时发生生命周期错误

如何使用 Rust Governor 为每 10 秒 10 个请求创建一个 RateLimiter?

如何将 Rust 字符串转换为 i8(c_char) 数组?

为什么在 rust 中删除 vec 之前应该删除元素

Rust 中的let是做什么的?

如果我不想运行析构函数,如何移出具有析构函数的 struct ?

如何创建动态创建值并向它们返回borrow 的工厂?

Rust 为什么 (u32, u32) 的枚举变体的大小小于 (u64)?

如何在 Rust 中使用特征标志来捕获多行代码?