types - 在 Rust 的枚举中使用现有类型

标签 types enums rust algebraic-data-types

假设我有两个结构:

struct BlankDoc {
    width: u32,
    height: u32
}

struct UrlDoc<'a> {
    url: &str<'a>
}

有没有什么方法可以使用枚举来创建 Doc 类型,该类型可以是 BlankDocUrlDoc,而无需重新实现(复制)他们所有的领域?

我是这样想的:

enum Doc {
    &BlankDoc
    &UrlDoc
}

type Doc = BlankDoc|UrlDoc;

(显然这两种方式都不存在。)

在 Rust 中建模的惯用方法是什么?

最佳答案

您可以将现有结构包装在枚举中。例如

enum Doc<'a> {
    Blank(BlankDoc),
    Url(UrlDoc<'a>),
}

然后你可以这样做:

fn test<'a>(doc: Doc<'a>) {
    match doc {
        Doc::Blank( BlankDoc { width: w, height: h }) =>
            println!("BlankDoc with w:{}, h:{}", w, h),
        Doc::Url( UrlDoc { url: u }) =>
            println!("UrlDoc with url:{}", u),
    }
}

full playground example

关于types - 在 Rust 的枚举中使用现有类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34764702/

相关文章:

c - 使用双倍数据速率的数据简单比较

c++ - void* (*)() 和 void* 有什么区别?

java - 如何将枚举干净地链接到类中的静态信息?

dll - 可以像 c 库那样从其他语言使用 rust 库吗?

polymorphism - 属于特征的对象的向量

java - Node 缓冲区打印问题

C: 是否使用转换为 "outer"结构类型的指针访问嵌套结构的初始成员?

ios - 将枚举案例与参数进行比较

java - 如何在 hibernate 中将枚举序号映射到它的值?

vector - 如何使用 fold 对向量求和?