gpt4 book ai didi

enums - Rust-将特征包装在枚举中以用于内存布局和更简单的泛型?

转载 作者:行者123 更新时间:2023-12-03 11:43:29 26 4
gpt4 key购买 nike

因此,我的代码中包含以下内容:

// Trait
trait Shape {
fn area(&self) -> f32;
}

// Rect
struct Rect {
width: f32,
height: f32
}
impl Shape for Rect {
fn area(&self) -> f32 {
self.width * self.height
}
}

// Circle
struct Circle {
radius: f32
}
impl Shape for Circle {
fn area(&self) -> f32 {
self.radius * self.radius * std::f32::consts::PI
}
}

// usage
fn use_shapes(shapes: Vec<Box<dyn Shape>>) {
// ...
}

而且我真的不喜欢 Box<dyn ...>,无论是在性能上还是因为它感觉很糟糕。我对特质的实现很少而且很明确,因此感觉很像成为枚举的候选人。

在将其转换为枚举的过程中,我偶然发现了以下模式:

// Wrapper enum
enum ShapeEnum {
Rect(Rect),
Circle(Circle)
}
impl Shape for ShapeEnum {
fn area(&self) -> f32 {
match self {
ShapeEnum::Rect(data) => data.area(),
ShapeEnum::Circle(data) => data.area(),
}
}
}

// new usage
fn use_shapes(shapes: Vec<ShapeEnum>) {
// ...
}

很整洁。这也感觉像是在以某种方式作弊。它可以按预期进行编译和运行,这非常不寻常,以至于我想查看是否有我现在看不到的任何意外的缺点/成本/怪癖?

我还想知道,由于枚举实现的确定性,它是否可以构成一个很好的宏?自动围绕特征及其实现者集生成一个枚举,该枚举本身会像 dyn版本那样实现该特征。

最佳答案

I wanted to see if there are any unexpected drawbacks/costs/quirks that I'm not seeing right now?



我能想到的唯一真正的缺点是,最终您将所有这些类型的定义集中到了一起-使得允许第三方 Hook 到您的代码中变得更加困难。

您可以通过添加动态调度枚举来解决此问题,这意味着您只会在那些外部定义的类型上获得较慢的行为。
// Wrapper enum
enum ShapeEnum {
Rect(Rect),
Circle(Circle),
Dynamic(Box<T: Shape>),
}

impl Shape for ShapeEnum {
fn area(&self) -> f32 {
match self {
ShapeEnum::Rect(data) => data.area(),
ShapeEnum::Circle(data) => data.area(),
ShapeEnum::Dynamic::(data) => data.area(),
}
}
}

I'm also wondering if, because of the deterministic nature of the enum implementation, it would make a good macro? Automatically generating an enum around a trait and a set of its implementors, which itself implements the trait just like a dyn version would



看来 enum_dispatch箱子几乎可以做到这一点。

免责声明:我自己没有使用过。

关于enums - Rust-将特征包装在枚举中以用于内存布局和更简单的泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59889518/

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