gpt4 book ai didi

rust - 在向量中找到匹配的枚举,并在Rust中返回错误

转载 作者:行者123 更新时间:2023-12-03 11:47:34 25 4
gpt4 key购买 nike

我总是愿意在软件中找到性能最好的最佳解决方案。
因此,我想问一下是否有解决我问题的最佳选择。
我有一个定义的枚举

#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
#[repr(i32)]
#[derive(serde::Serialize, serde::Deserialize)]
#[derive(strum_macros::EnumString, strum_macros::Display)]
pub enum CarMotive {
Standard = 0,
Deluxe = 1,
Sport = 2,
}
我有一个字符串向量 ["standard","deluxe"],它来自一个csv文件。
我想检查一下Vector和Enums之间的巧合。
如果没有“匹配”,则为每个Enum选项给出一个错误。
我以这种方式解决了。
每个枚举选项都有一个函数,如果不匹配,则有一个返回错误的函数。
动机1:
pub fn find_standard(
dataset: &[String],
) -> Result<(), Box<dyn std::error::Error>> {
match dataset.iter().find(|&m| {
let car_motive = CarMotive::from_str(&m.motive);
if car_motive == Ok(CarMotive::Standard) {
true
} else {
false
}
}) {
Some(_x) => (),
None => print_an_error(&format!(
"CarMotive:Standard Motive missing in vector"
)),
}

Ok(())
}
动机2:
pub fn find_deluxe(
dataset: &[String],
) -> Result<(), Box<dyn std::error::Error>> {
match dataset.iter().find(|&m| {
let car_motive = CarMotive::from_str(&m.motive);
if car_motive == Ok(CarMotive::Deluxe) {
true
} else {
false
}
}) {
Some(_x) => (),
None => print_an_error(&format!(
"CarMotive:Deluxe Motive missing in vector"
)),
}

Ok(())
}
动机3:
pub fn find_sport(
dataset: &[String],
) -> Result<(), Box<dyn std::error::Error>> {
match dataset.iter().find(|&m| {
let car_motive = CarMotive::from_str(&m.motive);
if car_motive == Ok(CarMotive::Sport) {
true
} else {
false
}
}) {
Some(_x) => (),
None => print_an_error(&format!(
"CarMotive:Sport Motive missing in vector"
)),
}

Ok(())
}
以及我必须测试的方式:
#[test]
#[serial]
fn find_standard_nok() {
let dataset = vec!["deluxe".to_string()];

let mut s_err = String::new();
{
let mut err_ssh = shh::stderr().unwrap();
find_standard(&dataset).unwrap();
let _ = err_ssh.read_to_string(&mut s_err).unwrap();
}
assert_eq!(s_err, "\"CarMotive:Standard Motive missing in vector\"\n");
}
我认为它没有最好的性能,因为它“循环”了3次数据集。
如果枚举数增加,我还必须添加另一个函数来检查匹配项。
我有前端背景,有时很难解决这样的功能。
提前致谢。

最佳答案

一种获得类似您所需要的内容并取消重复使用功能的方法是遍历数据并跟踪您所看到的独特enum值,如下所示:

pub fn find_matches(dataset: &[String]) -> HashSet<CarMotive> {
let mut matches = HashSet::new();
dataset.iter().for_each(|m| {
if let Ok(car_motive) = CarMotive::from_str(&m) {
matches.insert(car_motive);
}
});

return matches;
}

关于rust - 在向量中找到匹配的枚举,并在Rust中返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64488743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com