Enums 内存布局和更简单的泛型的枚举中的锈包装特性?

Enums 内存布局和更简单的泛型的枚举中的锈包装特性?,enums,rust,polymorphism,traits,Enums,Rust,Polymorphism,Traits,因此,我的代码中有如下内容: //Trait 性状形状{ fn区域(和自身)->f32; } //直肠 结构矩形{ 宽度:f32, 身高:f32 } 矩形的impl形状{ fn区域(自身)->f32{ 自宽*自高 } } //圈 结构圆{ 半径:f32 } 圆的impl形状{ fn区域(自身)->f32{ self.radius*self.radius*std::f32::consts::PI } } //用法 fn使用_形状(形状:Vec){ // ... } 我真的不喜欢框,因为它的性能和

因此,我的代码中有如下内容:

//Trait
性状形状{
fn区域(和自身)->f32;
}
//直肠
结构矩形{
宽度:f32,
身高:f32
}
矩形的impl形状{
fn区域(自身)->f32{
自宽*自高
}
}
//圈
结构圆{
半径:f32
}
圆的impl形状{
fn区域(自身)->f32{
self.radius*self.radius*std::f32::consts::PI
}
}
//用法
fn使用_形状(形状:Vec){
// ...
}
我真的不喜欢
,因为它的性能和感觉都很糟糕。我对我的特质的实现很少且明确,所以我觉得它是成为enum的一个很好的候选者

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

//包装器枚举
沙皮努姆{
Rect(Rect),
圆圈(圆圈)
}
ShapeEnum的impl形状{
fn区域(自身)->f32{
匹配自我{
shapenum::Rect(data)=>data.area(),
圆(数据)=>data.area(),
}
}
}
//新用法
fn使用_形状(形状:Vec){
// ...
}
它很整洁。这也让人感觉像是在作弊。它按照预期进行编译和工作,非常不寻常,我想看看是否有任何我现在没有看到的意外缺点/成本/怪癖

我还想知道,由于enum实现的确定性,它是否会成为一个好的宏?围绕一个trait和它的一组实现者自动生成一个enum,它本身实现trait就像
dyn
版本一样

我想看看是否有我现在没有看到的任何意想不到的缺点/成本/怪癖


我能想到的唯一真正的缺点是,最终会集中所有这些类型的定义——这使得第三方很难与代码挂钩

您可以通过添加动态调度枚举来解决这个问题,这意味着您只能在那些外部定义的类型上获得较慢的行为

// 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(),
        }
    }
}
//包装器枚举
沙皮努姆{
Rect(Rect),
圈(圈),,
动态(框),
}
ShapeEnum的impl形状{
fn区域(自身)->f32{
匹配自我{
shapenum::Rect(data)=>data.area(),
圆(数据)=>data.area(),
shapenum::Dynamic::(data)=>data.area(),
}
}
}
我还想知道,由于枚举的确定性 实现时,它会成为一个好的宏吗?自动生成 围绕一个trait及其一组实现者的枚举,它本身 实现特性,就像dyn版本一样

看起来板条箱几乎就是这样做的

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

我想看看是否有我现在没有看到的任何意想不到的缺点/成本/怪癖


我能想到的唯一真正的缺点是,最终会集中所有这些类型的定义——这使得第三方很难与代码挂钩

您可以通过添加动态调度枚举来解决这个问题,这意味着您只能在那些外部定义的类型上获得较慢的行为

// 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(),
        }
    }
}
//包装器枚举
沙皮努姆{
Rect(Rect),
圈(圈),,
动态(框),
}
ShapeEnum的impl形状{
fn区域(自身)->f32{
匹配自我{
shapenum::Rect(data)=>data.area(),
圆(数据)=>data.area(),
shapenum::Dynamic::(data)=>data.area(),
}
}
}
我还想知道,由于枚举的确定性 实现时,它会成为一个好的宏吗?自动生成 围绕一个trait及其一组实现者的枚举,它本身 实现特性,就像dyn版本一样

看起来板条箱几乎就是这样做的


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

“您最终将集中所有这些类型的定义-使第三方更难连接到您的代码中”对,但任何枚举的使用都是如此。这种方法不仅使“切换”到枚举更容易,而且在评估影响时更容易来回切换。动态回退的想法真是妙不可言!这似乎是一个真正的两全其美的选择。“你最终集中了所有这些类型的定义,这使得第三方更难连接到你的代码中”,对吧,但任何枚举的使用都是如此。这种方法不仅使“切换”到枚举更容易,而且在评估影响时更容易来回切换。动态回退的想法真是妙不可言!似乎是一个真正的两全其美的选择。