只有当Self时才具有特征:Sized

问题描述 投票:1回答:1

假设我有一个特征

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用作特征对象(没有可以防止这种情况发生的函数),并且可以在模板代码中使用它并在其上使用所有函数。

我的问题是,例如将Clone作为特征时,是否有可能出现这种现象?在dyn A情况下,A不实现克隆。在一般情况下是。

rust traits
1个回答
0
投票

您可以那样做:

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

因此您可以访问A方法和Clone中的make_clone超级特性,显然可以使用超级特性而不是通用方法执行相同的操作

© www.soinside.com 2019 - 2024. All rights reserved.