【问题标题】:Use existing types in an enum in Rust在 Rust 的枚举中使用现有类型
【发布时间】:2016-04-18 07:26:28
【问题描述】:

假设我有两个结构:

struct BlankDoc {
    width: u32,
    height: u32
}

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

是否有某种方法可以使用枚举来创建 BlankDocUrlDoc 类型的 Doc,而无需重新实现(复制)它们的所有字段?

我在想这样的事情:

enum Doc {
    &BlankDoc
    &UrlDoc
}

type Doc = BlankDoc|UrlDoc;

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

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

【问题讨论】:

    标签: types enums rust algebraic-data-types


    【解决方案1】:

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

    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

    【讨论】:

    • 很好,谢谢。似乎没有办法让现有的 BlankDoc 或 UrlDoc 匹配为 Doc 而无需包装它。那是对的吗?我的另一个实现该目标的想法是创建一个空的 Doc 特征,但我认为这是不允许的。
    • 我不确定您要做什么。你可以做this with a trait。但是,如果您想拥有一个在他的身体中决定的功能,就像我在答案中给出的第一个示例中那样,如果 Doc 是 BlankDoc 或 UrlDoc,那么您的选择就更有限了。有Any,但总的来说,对 Rust 特征的反省并不是特别好或惯用的
    • @ChrisMiddleton 这是一个example with Any,用于学习目的,但在 Rust 中你会这样做真的很少见。这可能是您在评论中提到空 Doc 特征时想到的?
    • 感谢您提供详细信息,您在答案中指定的方式肯定更好。
    猜你喜欢
    • 2023-02-14
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 2019-05-18
    相关资源
    最近更新 更多