簡體   English   中英

無法調用引用實現特征的類型的函數

[英]Unable to call a function with a reference to a type implementing a trait

我在了解如何使用特征和所有權時遇到了一些麻煩。 以下示例起作用:

struct X([u8; 4]);

impl X {
   pub fn get(&self, n: usize) -> u8 {
       self.0[n]
   }
}

fn f1(x: &X) {
    println!("{}", x.get(1));
    f2(&x);
}

fn f2(x: &X) {
    println!("{}", x.get(2));    
}

fn main() {
    let z1 = X([1u8, 2u8, 3u8, 4u8]);
    f1(&z1);
}

但是當我嘗試使用get創建特征(此處為XT )時:

trait XT {
  fn get(&self, n: usize) -> u8;
}

struct X([u8; 4]);

impl XT for X {
   fn get(&self, n: usize) -> u8 {
       self.0[n]
   }
}

fn f1<T: XT>(x: &T) {
    println!("{}", x.get(1));
    f2(&x);
}

fn f2<T: XT>(x: &T) {
    println!("{}", x.get(2));    
}

fn main() {
    let z1 = X([1u8, 2u8, 3u8, 4u8]);
    f1(&z1);
}

無法編譯以下錯誤消息:

沒有為&T類型實現特征XT

它的工作原理,如果我改變f2(&x)f2(x) 我的期望是,用特征替換類型,一切都會正常。

問題是您正在嘗試將&&T傳遞給f2 這意味着它期望&T實現XT ,但這不是您所說的:您說T實現了XT

您可以使用where T: XT, for<'a> &'a T: XT子句來修改f1以正確表達此約束,但是由於&X沒有實現XT ,因此您不能從main調用f1 所以,你去添加一個實現該為好然后代碼工作......但說實話,它更容易只是刪除&和調用f2(x)來代替。

換句話說,僅僅因為類型實現了特征並不意味着指向該類型的指針實現了特征。

暫無
暫無

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

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