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),
}
}