提问人:matej.tydli 提问时间:1/21/2023 最后编辑:user2722968matej.tydli 更新时间:1/21/2023 访问量:183
如果我知道生锈是不可能恐慌的,如何处理可能会恐慌
How to handle may panic if I know it is imposible to panic in rust
问:
我在第一次解析时遇到错误:如果索引越界,可能会恐慌。 但是在解析之前,如果应该处理这个问题。 如何正确处理错误?
print!("Write 2 ints separated by space: ");
let mut nums_string: String = String::new();
stdout().flush().expect(ERR_MSG_STDOUT_FLUSH);
stdin()
.read_line(&mut nums_string)
.expect(ERR_MSG_STDIN_READ_LINE);
let nums_str_vec: Vec<&str> = nums_string.trim().split(' ').collect();
let num1: i32;
let num2: i32;
if nums_str_vec.len() == 2 {
num1 = match nums_str_vec[0].parse() {
Err(_) => panic!("Wrong input"),
Ok(_) => nums_str_vec[0].parse().unwrap(),
};
num2 = match nums_str_vec[1].parse() {
Err(_) => panic!("Wrong input"),
Ok(_) => nums_str_vec[1].parse().unwrap(),
};
} else {
panic!("Wrong input");
}
是否可以在没有 if 的情况下处理错误并仅使用匹配项?
答:
2赞
mkrieger1
1/21/2023
#1
如果您知道“可能会恐慌”,则处理“可能会恐慌”的解决方案是不重复可能恐慌的代码。
如果您已经通过匹配大小写确定它是一个数字,则无需再次解析它。Ok
该数字包含在您当前忽略的值中。使用它!Ok
Ok(n) => n,
0赞
Masklinn
1/21/2023
#2
是否可以在没有 if 的情况下处理错误并仅使用匹配项?
在完成 mkrieger1 的答案之后,由于切片模式,在 vec 之前进行一些额外的转换将为您提供更简单的匹配:
let nums: Vec<Result<i32, _>> = nums_string.trim().split_whitespace().map(str::parse).collect();
match nums[..] {
[Ok(n1), Ok(n2)] => println!("{} {}", n1, n2),
_ => println!("Wrong input"),
}
评论
0赞
matej.tydli
1/21/2023
谢谢,但这是我第一次生锈。我无法完全理解您的代码。经过一段时间的生锈后,我肯定会看看这个解决方案。
评论