gpt4 book ai didi

rust - 根据运行时值传递不同的特征实现

转载 作者:行者123 更新时间:2023-11-29 08:28:13 24 4
gpt4 key购买 nike

我正在尝试使用与以下代码等效的东西:

struct MyStruct {}

struct MyStruct2 {}

trait CanDoIt {
fn do_it(&self) -> String;
}

impl CanDoIt for MyStruct {
fn do_it(&self) -> String {
"done".into()
}
}


impl CanDoIt for MyStruct2 {
fn do_it(&self) -> String {
"done 2".into()
}
}


fn do_a<T: CanDoIt>(value: T) -> String {
value.do_it()
}


fn main() {
let s: dyn CanDoIt = if true {
MyStruct {}
} else {
MyStruct2 {}
};

println!("Done it: {}", do_a(s))
}

if 条件可能取决于某些运行时值,例如硬件是否支持某些功能。

我尝试了不同的方法,比如让结构也实现 Sized,但我总是会遇到这样的编译错误:

   |
29 | let s: dyn CanDoIt = if true {
| ^ doesn't have a size known at compile-time
|

当您需要根据某些运行时值传递不同的实现时,有什么解决方案?

最佳答案

像您的 CanDoIt 这样的特质没有大小,因为它们不是具体类型,因此不能直接存储为值。一个人只能存储一个 trait object喜欢Box<dyn CanDoIt>&dyn CanDoIt

因此对于您使用的示例 &dyn CanDoIt它看起来像这样:

struct MyStruct {}

struct MyStruct2 {}

trait CanDoIt {
fn do_it(&self) -> String;
}

impl CanDoIt for MyStruct {
fn do_it(&self) -> String {
"done".into()
}
}


impl CanDoIt for MyStruct2 {
fn do_it(&self) -> String {
"done 2".into()
}
}


fn do_a(value: &dyn CanDoIt) -> String {
value.do_it()
}


fn main() {
let s: &dyn CanDoIt = if true {
&MyStruct {}
} else {
&MyStruct2 {}
};

println!("Done it: {}", do_a(s))
}

关于rust - 根据运行时值传递不同的特征实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58659438/

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