Enums 如何在rust中参数化枚举数?
我对生锈很陌生,面临着以下简单的问题 我有以下两个枚举:Enums 如何在rust中参数化枚举数?,enums,rust,type-safety,Enums,Rust,Type Safety,我对生锈很陌生,面临着以下简单的问题 我有以下两个枚举: enum SourceType{ File, Network } enum SourceProperties{ FileProperties { file_path: String }, NetworkProperties { ip: String } } 现在我希望使用HashMap,但在这样的实现中,可能会出现映射File->NetworkProperties,这不
enum SourceType{
File,
Network
}
enum SourceProperties{
FileProperties {
file_path: String
},
NetworkProperties {
ip: String
}
}
现在我希望使用HashMap
,但在这样的实现中,可能会出现映射File->NetworkProperties
,这不是预期的结果
我曾考虑以某种方式使用SourceType
参数化enum SourceProperties
,但这似乎是不可能的。有没有办法提供这样的安全保证
UPD:拥有枚举源类型的意图是,实际的源类型
是一个用户输入,将被解码为字符串
值(“文件”
,“网络”
)。所以工作流看起来像这样
"File" -> SourceType::File -> SourceProperties::NetworkProperties
您可以简单地使用一个哈希集和一个封装属性的enum
,用于后面的属性匹配:
use std::collections::HashSet;
#[derive(PartialEq, Eq, Hash)]
struct FileProperties {
file_path: String
}
#[derive(PartialEq, Eq, Hash)]
struct NetworkProperties {
ip: String
}
#[derive(PartialEq, Eq, Hash)]
enum Source {
File(FileProperties),
Network(NetworkProperties)
}
fn main() {
let mut set : HashSet<Source> = HashSet::new();
set.insert(Source::File(FileProperties{file_path: "foo.bar".to_string()}));
for e in set {
match e {
Source::File(properties) => { println!("{}", properties.file_path);}
Source::Network(properties) => { println!("{}", properties.ip);}
}
}
}
使用std::collections::HashSet;
#[导出(PartialEq、Eq、Hash)]
结构文件属性{
文件路径:字符串
}
#[导出(PartialEq、Eq、Hash)]
结构网络属性{
ip:字符串
}
#[导出(PartialEq、Eq、Hash)]
枚举源{
文件(文件属性),
网络(网络属性)
}
fn main(){
让mut set:HashSet=HashSet::new();
insert(Source::File(FileProperties{File_path:“foo.bar.”to_string()});
对于集合中的e{
匹配e{
Source::File(properties)=>{println!(“{}”,properties.File_path);}
Source::Network(properties)=>{println!(“{}”,properties.ip);}
}
}
}
您能否提供一个示例,说明您为什么实际需要SourceType
enum?常见的Rust习惯用法是只使用SourceProperties
并根据其变量确定类型。由于SourceType
只有两个可能的值,因此哈希映射只能有零个、一个或两个元素,并且您希望这两个元素具有两个固定类型。这听起来不像是一个映射,而是一个结构源{file:Option,network:Option}
。如果在哈希映射中最多(或正好)需要一个元素,只需使用SourceProperties
,如前一评论所述。@eggyal使用单独的枚举源类型
的主要目的是,应用程序将接受包含编码为字符串
值(“文件”
,“网络”
)的源类型
的用户请求。因此,我认为有一个单独的enum
是明智的,这样工作流看起来就像“文件”
->SourceType::File
->FileProperties
@SvenMarnach拥有enum SourceType
的原因是它是从用户输入解码的。所以我认为定义这样的类型是很自然的。更新了问题。