gpt4 book ai didi

rust - Supertrait 仅当 Self : Sized

转载 作者:行者123 更新时间:2023-11-29 08:19:46 26 4
gpt4 key购买 nike

假设我有一个特质

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 时出现此行为?作为 super 特质?在dyn A案例A不实现克隆。在一般情况下是这样。

最佳答案

你可以这样做:

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 supertrait,你显然可以用 supertrait 而不是 a泛型方法

关于rust - Supertrait 仅当 Self : Sized,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58237711/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com