Trait std::ops::Deref

1.0.0 · source ·
pub trait Deref {
    type Target: ?Sized;

    // Required method
    fn deref(&self) -> &Self::Target;
}
Expand description

用于不可变解引用操作,例如 *v

Deref 除了在不可变上下文中用于 (unary) * 运算符的显式解引用操作外,在许多情况下,编译器都隐式使用 Deref。 该机制称为 Deref 强制多态。 在可变上下文中,使用 DerefMut

为智能指针实现 Deref 使得访问它们背后的数据变得方便,这就是为什么它们实现 Deref 的原因。 另一方面,有关 DerefDerefMut 的规则是专门为容纳智能指针而设计的。 因此,Deref 只应为智能指针实现,以避免混淆。

出于类似的原因,这个 trait 永远不会失败。当隐式调用 Deref 时,解引用过程中的失败可能会造成极大的混乱。

有关 Deref 强制多态的更多信息

如果 T 实现 Deref<Target = U>,并且 xT 类型的值,则:

  • 在不可变的上下文中,*x (其中 T 既不是引用也不是裸指针) 等效于 *Deref::deref(&x)
  • &T 类型的值被强制为 &U 类型的值
  • T 隐式地实现了 U 类型的所有 (immutable) 方法。

有关更多详细信息,请访问 Rust 编程语言中的章节 以及 解引用运算符方法解析类型强制转换 上的引用部分。

Examples

具有解引用的结构体可访问的具有单个字段的结构体。

use std::ops::Deref;

struct DerefExample<T> {
    value: T
}

impl<T> Deref for DerefExample<T> {
    type Target = T;

    fn deref(&self) -> &Self::Target {
        &self.value
    }
}

let x = DerefExample { value: 'a' };
assert_eq!('a', *x);
Run

Required Associated Types§

source

type Target: ?Sized

解引用后的结果类型。

Required Methods§

source

fn deref(&self) -> &Self::Target

解引用值。

Implementors§

source§

impl Deref for CString

§

type Target = CStr

source§

impl Deref for OsString

source§

impl Deref for PathBuf

§

type Target = Path

source§

impl Deref for String

§

type Target = str

1.36.0 · source§

impl<'a> Deref for IoSlice<'a>

§

type Target = [u8]

1.36.0 · source§

impl<'a> Deref for IoSliceMut<'a>

§

type Target = [u8]

source§

impl<'a, 'f> Deref for VaList<'a, 'f>where 'f: 'a,

§

type Target = VaListImpl<'f>

source§

impl<B> Deref for Cow<'_, B>where B: ToOwned + ?Sized, <B as ToOwned>::Owned: Borrow<B>,

§

type Target = B

1.33.0 · source§

impl<P> Deref for Pin<P>where P: Deref,

§

type Target = <P as Deref>::Target

source§

impl<T> Deref for &Twhere T: ?Sized,

§

type Target = T

source§

impl<T> Deref for &mut Twhere T: ?Sized,

§

type Target = T

source§

impl<T> Deref for ThinBox<T>where T: ?Sized,

§

type Target = T

source§

impl<T> Deref for Ref<'_, T>where T: ?Sized,

§

type Target = T

source§

impl<T> Deref for RefMut<'_, T>where T: ?Sized,

§

type Target = T

1.12.0 · source§

impl<T> Deref for PeekMut<'_, T>where T: Ord,

§

type Target = T

1.20.0 · source§

impl<T> Deref for ManuallyDrop<T>where T: ?Sized,

§

type Target = T

1.9.0 · source§

impl<T> Deref for AssertUnwindSafe<T>

§

type Target = T

source§

impl<T> Deref for Rc<T>where T: ?Sized,

§

type Target = T

source§

impl<T> Deref for Arc<T>where T: ?Sized,

§

type Target = T

source§

impl<T, A> Deref for Box<T, A>where A: Allocator, T: ?Sized,

§

type Target = T

source§

impl<T, A> Deref for Vec<T, A>where A: Allocator,

§

type Target = [T]

source§

impl<T, F> Deref for LazyCell<T, F>where F: FnOnce() -> T,

§

type Target = T

source§

impl<T, F: FnOnce() -> T> Deref for LazyLock<T, F>

§

type Target = T

source§

impl<T: ?Sized> Deref for MutexGuard<'_, T>

§

type Target = T

source§

impl<T: ?Sized> Deref for RwLockReadGuard<'_, T>

§

type Target = T

source§

impl<T: ?Sized> Deref for RwLockWriteGuard<'_, T>

§

type Target = T