我正在尝试创建一个具有不同类型的HashMap。我不想为特定数据类型创建两个不同的HashMap。
我的代码如下:
use std::collections::HashMap;
#[derive(Debug)]
enum DataTypes {
String(String),
Bool(bool),
}
fn get_hashmap() -> Result<HashMap<String, DataTypes>, ()>{
let data = HashMap::from([
("password".to_string(), DataTypes::String("password".to_string())),
("username".to_string(), DataTypes::String("Fun username".to_string())),
("is_blocked".to_string(), DataTypes::Bool(true)),
("is_confirmed".to_string(), DataTypes::Bool(false)),
]);
Ok(data)
}
fn main() {
let data = get_hashmap().unwrap();
let keys = data.keys();
println!("Keys: {:?}", &keys);
for key in keys {
let result: Option<T> = match data.get(key).unwrap() {
DataTypes::Bool(value) => Some(value),
DataTypes::String(value) => Some(value),
_ => panic!("Error!"),
};
println!("Result of matching: {:?}", &result);
}
}
正如你所看到的,我正在尝试匹配枚举来获取它们的值。但是我有一些数据类型的问题。我的解决方案是 Package 匹配到一些结构的结果。但是主要问题仍然没有解决。
所以我想在Option类中做一个匹配的结果,使unwrap()可用。但是我不知道怎样才能正确地做...
我有两个问题:
1.我能做得更好吗?
1.我如何 Package 让结果:工作状态选项?
2条答案
按热度按时间8hhllhi21#
一些反馈:
_
默认匹配大小写,这会隐藏将来的错误。DataTypes
,将其命名为DataType
。result
必须是一个特定的类型。枚举的全部意义在于你可以分别处理不同的值,所以把它们组合在一个result
类型中是没有意义的。当然你可以把result
保留为DataType
对象,并为它实现Debug
/Display
,这就是我在修改后的代码中要做的。unwrap()
,这使得你的代码更不容易出错。不过不用担心,你不需要在使用这个枚举的任何地方都使用
match
,否则与两个单独的散列表相比,你不会有太大的优势。相反,你可以为所有枚举条目定义共享功能,并将match
隐藏在其中。一个二个一个一个
如果您的目标是将序列化/反序列化添加到您的结构中(就像您在这里手动实现的那样),让我向您提示一下
serde
,它已经免费处理了大部分序列化。就像在这个例子中(可能是也可能不是你的结构体的样子),它将你的结构体序列化为JSON或者从JSON序列化:
kdfy810k2#
感谢Finomnis我找到了我想要的方法。这就是我的解决方案。
我认为当我们想要使用数据库时,当我们不想序列化所有的用户结构时,这会很有帮助。
也许这可以做得更好。再次感谢大家的大力帮助!:)