我正在阅读Rust的 Deref 特性的文档:

pub trait Deref {
    type Target: ?Sized;
    fn deref(&self) -> &Self::Target;
}
deref函数的类型签名对我来说似乎违反直觉。为什么返回类型是引用?如果引用实现了此特性,因此可以将其取消引用,那么这将产生什么影响?

我能提出的唯一解释是,引用未实现Deref,但被认为是“本来可取消引用的”。但是,如何编写适用于任何可取消引用类型的多态函数,包括Deref<T>&T呢?

最佳答案



您可以看到all the types that implement Deref ,并且&T在该列表中:

impl<'a, T> Deref for &'a T where T: ?Sized

不明显的是,当您将*运算符与实现Deref的东西一起使用时,会应用语法糖。看看这个小例子:
use std::ops::Deref;

fn main() {
    let s: String = "hello".into();
    let _: () = Deref::deref(&s);
    let _: () = *s;
}

error[E0308]: mismatched types
 --> src/main.rs:5:17
  |
5 |     let _: () = Deref::deref(&s);
  |                 ^^^^^^^^^^^^^^^^ expected (), found &str
  |
  = note: expected type `()`
             found type `&str`

error[E0308]: mismatched types
 --> src/main.rs:6:17
  |
6 |     let _: () = *s;
  |                 ^^ expected (), found str
  |
  = note: expected type `()`
             found type `str`

deref的显式调用返回&str,但是运算符*返回str。更像是您在调用*Deref::deref(&s),而忽略了隐式的无限递归。

Xirdus is correct in saying



尽管“无用”有点强;对于实现Copy的类型仍然有用。

也可以看看:
  • Why does asserting on the result of Deref::deref fail with a type mismatch?

  • 请注意,以上所有内容对于IndexIndexMut也是有效的。

    关于pointers - 为什么Deref::deref本身的返回类型是引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31624743/

    10-11 18:34