Generics 锈蚀';s枚举与泛型

Generics 锈蚀';s枚举与泛型,generics,enums,rust,Generics,Enums,Rust,在Rust中,似乎有两种类似的方法来构造数据: pub enum FooEnum { Bar {ts: DateTime, bar: Bar}, Baz {ts: DateTime, baz: Baz} } 及 pub结构{ 酒吧ts:DateTime, 发布内容:T } 我可以看出,枚举方法为我提供了更好的字段名foo和bar,但代价是重复定义ts 使用通用方法是否有优势?(我将把serde与JSON和bincode一起使用。)泛型通常具有更好的性能,因为编译器可以为每个变

在Rust中,似乎有两种类似的方法来构造数据:

pub enum FooEnum {
    Bar {ts: DateTime, bar: Bar},
    Baz {ts: DateTime, baz: Baz}
}

pub结构{
酒吧ts:DateTime,
发布内容:T
}
我可以看出,枚举方法为我提供了更好的字段名
foo
bar
,但代价是重复定义
ts


使用通用方法是否有优势?(我将把serde与JSON和bincode一起使用。)

泛型通常具有更好的性能,因为编译器可以为每个变量生成专门的代码。它们占用的内存也稍微少一些,因为枚举需要存储一个判别式来跟踪当前使用的变体

此外,枚举不需要在编译时知道类型,甚至可以在执行期间动态更改内容类型

如果不想重复
ts
字段,另一个选项是使用:


枚举的所有变体将具有相同的大小,而泛型结构将(可能)不具有相同的大小。即,您将无法将具有不同泛型参数的结构实例分配给同一变量,而您将能够将不同的枚举变量分配给同一枚举变量。没有-枚举不是运行时多态性的-请阅读
traits
和动态调度,如果您需要运行时多态性,这是否回答了您的问题?
pub struct FooGeneric<T: BarAndBazLike> {
    pub ts: DateTime<Utc>,
    pub content: T
}
extern crate either; // 1.5.3
extern crate chrono; // 0.4.13

use either::Either;
use chrono::{ DateTime, Utc };

pub struct Bar {}
pub struct Baz {}

pub struct Foo {
    pub ts: DateTime<Utc>,
    pub content: Either<Bar, Baz>,
}
extern crate chrono; // 0.4.13

use chrono::{ DateTime, Utc };

pub struct Bar {}
pub struct Baz {}

pub enum BarOrBaz {
    Bar (Bar),
    Baz (Baz),
}

pub struct Foo {
    pub ts: DateTime<Utc>,
    pub content: BarOrBaz,
}