簡體   English   中英

什么時候我不應該實現引用該特征的實現者的特征?

[英]When should I not implement a trait for references to implementors of that trait?

如果我有一個特征,並且接受一個約束到該類型的泛型類型的函數,一切正常。 如果我嘗試傳入對該類型的引用,我會收到編譯錯誤。

trait Trait {
    fn hello(&self) -> u32;
}

struct Struct(u32);

impl Trait for Struct {
    fn hello(&self) -> u32 {
        self.0
    }
}

fn runner<T: Trait>(t: T) {
    println!("{}", t.hello())
}

fn main() {
    let s = Struct(42);

    // Works
    runner(s);

    // Doesn't work
    runner(&s);
}
error[E0277]: the trait bound `&Struct: Trait` is not satisfied
  --> src/main.rs:24:5
   |
24 |     runner(&s);
   |     ^^^^^^ the trait `Trait` is not implemented for `&Struct`
   |
   = help: the following implementations were found:
             <Struct as Trait>
note: required by `runner`
  --> src/main.rs:13:1
   |
13 | fn runner<T: Trait>(t: T) {
   | ^^^^^^^^^^^^^^^^^^^^^^^^^

我可以通過為實現特征的類型的任何引用實現特征來解決問題:

impl<'a, T> Trait for &'a T
where
    T: Trait,
{
    fn hello(&self) -> u32 {
        (*self).hello()
    }
}

我遺失的那條信息是什么時候不應該實現這個? 問另一種方式,為什么編譯器不會自動為我實現這個? 由於目前沒有,我認為必須存在這種實施方式不利的情況。

什么時候不應該實現這個? 問另一種方式,為什么編譯器不會自動為我實現這個? 由於目前沒有,我認為必須存在這種實施方式不利的情況。

舉個例子,我們立刻想到了Default特質。

pub trait Default {
    fn default() -> Self;
}

我可以為T實現它,但是沒有辦法為&T自動實現它。

您在此處撰寫的特定特征僅通過引用self ,這是可以編寫您執行的其他實現的唯一原因。

因此,將參數設置為runner()的值可能是不合需要的; 你應該參考它。 本指南一般可以適用:如果可以實現特征參考,而不是想知道“我應該實現它嗎?”你應該想知道“我為什么實現它?”因為你應該使用它的唯一情況應該是首先要改變以通過引用獲取對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM