gpt4 book ai didi

rust - 允许多态变量吗?

转载 作者:行者123 更新时间:2023-11-29 08:20:54 25 4
gpt4 key购买 nike

我有各种结构,它们都实现了相同的特征。我想在某些情况下进行分支,在运行时决定要实例化哪些结构。然后,无论我遵循哪个分支,我都想从该特征调用方法。

这在 Rust 中可能吗?我希望实现类似以下内容(无法编译):

trait Barks {
fn bark(&self);
}

struct Dog;

impl Barks for Dog {
fn bark(&self) {
println!("Yip.");
}
}

struct Wolf;

impl Barks for Wolf {
fn bark(&self) {
println!("WOOF!");
}
}

fn main() {
let animal: Barks;
if 1 == 2 {
animal = Dog;
} else {
animal = Wolf;
}
animal.bark();
}

最佳答案

是的,但没那么容易。你在那里写的是 animal应该是 Barks 类型的变量,但是Barks是一种特质;接口(interface)的描述。特征没有静态定义的大小,因为任何大小的类型都可能出现并且 impl Barks .编译器不知道要生成多大 animal .

您需要做的是添加一个间接层。在这种情况下,您可以使用 Box , 虽然你也可以使用像 Rc 这样的东西或普通引用:

fn main() {
let animal: Box<dyn Barks>;

if 1 == 2 {
animal = Box::new(Dog);
} else {
animal = Box::new(Wolf);
}

animal.bark();
}

在这里,我正在分配 DogWolf在堆上,然后将其转换为 Box<dyn Barks> .这有点类似于将对象转换为 C# 或 Java 之类的接口(interface),或者转换 Dog*。到 Barks*在 C++ 中。

您还可以使用的另一种完全不同的方法是枚举。你可以有 enum Animal { Dog, Wolf }然后定义一个 impl Animal { fn bark(&self) { ... } } .取决于您是否需要一组完全开放的动物和/或多种特征。

最后,请注意上面的“有点”。有很多东西不能像在 Java/C#/C++ 中那样工作。例如,Rust 没有向下转换(你不能从 Box<dyn Barks> 回到 Box<Dog> ,或者从一个特征到另一个特征)。此外,这仅在特征是“对象安全”(无泛型,不使用 selfSelf 按值)时才有效。

关于rust - 允许多态变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47850312/

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