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
的原因是它是从用户输入解码的。所以我认为定义这样的类型是很自然的。更新了问题。