我正在尝试解析一些用户输入,输入存储在一个结构中,其中有很多选项/结果(以处理用户输入之前未初始化的数据),并且当用户提交时,它需要进入一个已知所有值的结构中。
我希望能够生成一个包含所有错误的向量,这样我就可以向用户反馈输入的所有错误(而不仅仅是第一个错误)。但是,我找不到一个好的方法来实现这一点。
struct Test {
x: i32,
y: String,
}
#[derive(Debug)]
enum Errors {
OneIsNone,
TwoIsNone,
}
我目前的方法是:
fn main() -> Result<Test, Vec<Errors>> {
let option1 = Some(5);
let option2 = None;
let mut errors = Vec::new();
let x: i32;
match option1 {
Some(value) => x = value,
None => errors.push(Errors::OneIsNone),
};
let y: String;
match option2 {
Some(value) => y = value,
None => errors.push(Errors::TwoIsNone),
}
if errors.len() != 0 {
return Err(errors)
}
Ok(
Test {
x,
y
}
)
}
这是行不通的,因为如果代码到达Ok
块,编译器就无法判断 x 和 y 是否必须初始化。
在这种情况下,我可以解开匹配两个结果,但对于具有大量字段的结构来说,这种方法会变得非常笨重。
基本上我想要一种方法来接收大量的结果并将它们解析成一个结构,如果它们都给出Ok()
或返回一个包含所有错误的向量,否则,即我如何unwrap_or_errors
实现
fn main() -> Result<Test, Vec<Errors>> {
let option1 = Some(5);
let option2 = None;
let mut errors = Vec::new();
let x = match option1 {
Some(val) => Ok(val),
None => Err(Errors::OneIsNone),
};
let y = match option2 {
Some(val) => Ok(val),
None => Err(Errors::TwoIsNone),
};
if errors.len() != 0 {
return Err(errors)
}
Test::unwrap_or_errors(x, y)?
}