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

Types 在Rust中使用枚举中的现有类型,types,enums,rust,algebraic-data-types,Types,Enums,Rust,Algebraic Data Types,假设我有两个结构: struct BlankDoc { width: u32, height: u32 } struct UrlDoc<'a> { url: &str<'a> } 或 (显然这两种方式都不存在。) 在Rust中对此建模的惯用方法是什么?您可以将现有结构封装在枚举中。乙二醇 enum Doc<'a> { Blank(BlankDoc), Url(UrlDoc<'a>), } enu

假设我有两个结构:

struct BlankDoc {
    width: u32,
    height: u32
}

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

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


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

您可以将现有结构封装在枚举中。乙二醇

enum Doc<'a> {
    Blank(BlankDoc),
    Url(UrlDoc<'a>),
}
enum Doc),
}
然后您可以执行以下操作,例如:

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),
    }
}
fn测试){
匹配文件{
Doc::Blank(BlankDoc{width:w,height:h})=>
println!(“带w:{},h:{},w,h的BlankDoc),
Doc::Url(UrlDoc{Url:u})=>
println!(“url为{},u的UrlDoc),
}
}

很好,谢谢。似乎没有一种方法可以将现有的BlankDoc或UrlDoc匹配为
Doc
,而不进行包装。对吗?我的另一个想法是创建一个空的
Doc
trait,但我知道这是不允许的。我不确定你想做什么。你能行。但是如果你想在他的身体里有一个决定的函数,就像我在答案中给出的第一个例子,如果Doc是BlankDoc或UrlDoc,你有更有限的选择。但总的来说,对锈病的自省并不是特别好或特别好idiomatic@ChrisMiddleton这里有一个例子,用于学习目的,但在生锈的环境中这样做是非常罕见的。这可能是你在评论中提到空文档特征时的想法?谢谢你提供的详细信息,你在回答中指定的方式肯定更好。
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),
    }
}