簡體   English   中英

僅當自我:大小時才具有超級特質

[英]Supertrait only when Self : Sized

假設我有一個特質

trait A {
    fn new() -> Self where Self : Sized;
    fn foo(&self) -> i32;
}
struct B {
   data : i32
}
impl A for B {
    fn new() -> Self {
        B {data : 42}
    }
    fn foo(&self) -> i32 {
        self.data
    }
}

現在我可以使用Box<dyn A> ,只是沒有可用的 new() 方法。 當我有一個通用的T: A時,我可以做T::new() 所以我可以使用 A 作為特征 object (沒有阻止這種情況的函數),我可以在模板代碼中使用它並使用它上面的所有函數。

我的問題是,當將Clone作為超級特征時,是否有可能獲得這種行為? dyn A情況下A沒有實現 Clone。 在一般情況下是。

你可以這樣做:

trait A {
    fn new() -> Self where Self : Sized;
    fn foo(&self) -> i32;
}

#[derive(Clone)]
struct B {
   data : i32
}

impl A for B {
    fn new() -> Self {
        B {data : 42}
    }
    fn foo(&self) -> i32 {
        self.data
    }
}


fn make_clone<T: Clone + A>(toc: &T) -> T {
    dbg!(toc.foo());
    toc.clone()
}

fn main() {
    let b = B{data: 0};
    make_clone(&b);
}

因此您可以從make_clone訪問A方法和Clone超特征,顯然您可以使用超特征而不是泛型方法做同樣的事情

暫無
暫無

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

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