當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Rust Deref用法及代碼示例


本文簡要介紹rust語言中 Trait std::ops::Deref 的用法。

用法

pub trait Deref {
    type Target: ?Sized;
    fn deref(&self) -> &Self::Target;
}

用於不可變的取消引用操作,例如 *v

除了用於(一元)的顯式取消引用操作*不可變上下文中的運算符,Deref在許多情況下,編譯器也會隱式使用。這種機製稱為'Deref 強製'.在可變的上下文中,std::ops::DerefMut被使用。

實施Deref對於智能指針來說,訪問它們背後的數據變得很方便,這就是他們實現的原因Deref。另一方麵,有關規則Derefstd::ops::DerefMut專門為適應智能指針而設計。因為這,Deref 隻能針對智能指針實現以避免混淆。

出於類似的原因,這個特質永遠不應該失敗。取消引用期間的失敗可能會非常令人困惑Deref被隱式調用。

更多關於 Deref 強製

如果 T 實現了 Deref<Target = U> ,並且 xT 類型的值,則:

  • 在不可變的上下文中,*x(其中 T 既不是引用也不是原始指針)等價於 *Deref::deref(&x)
  • &T 類型的值被強製轉換為 &U 類型的值
  • T 隱式實現 U 類型的所有(不可變)方法。

欲了解更多詳情,請訪問中的章節Rust 編程語言以及參考部分解引用運算符,方法解析類型強製.

例子

具有單個字段的結構,可通過取消引用該結構來訪問。

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);

相關用法


注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Trait std::ops::Deref。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。