У меня есть ветвь сопоставления, которая теоретически разрешает условие ошибки (если оно у меня есть), и тогда я хотел бы выполнить любой код, который я написал в ветке Ok() выше.
Возможно ли это сделать в Rust?
Пример:
let foo: Result<Bar, Error> = some_func();
match foo {
Ok(bar) => { Something happens here }
Err(e) => { Resolves error, and execute the Ok() case above }
}
Я не думаю, что вы можете «перепрыгнуть» на другую соответствующую руку, но вы можете просто сначала обработать только случай Err
, а затем безоговорочно то, что у вас было в случае Ok
:
let foo: Result<Bar, Error> = some_func();
if let Err(e) = foo {
// Resolve error
}
// Something happens here
Однако этот стиль работает только в том случае, если вам не нужно использовать bar
.
Вы можете использовать unwrap_or_else для обработки ошибок и замены их новыми bar
. Затем поместите код Ok
под ним, где у вас гарантированно будет bar
.
let foo: Result<Bar, Error> = some_func();
let bar = foo.unwrap_or_else(|e| {
// Resolve the error and return a replacement `bar`.
new_bar
});
// Proceed with `bar`.
Да, ты мог бы это сделать. Вам просто понадобится функция, которую они оба вызывают.
let foo: Result<Bar, Error> = some_func();
match foo {
Ok(bar) => do_stuff(),
Err(_) => do_stuff(),
}
Если вы хотите выполнить дополнительные действия в случае Err, вы можете включить их в блок сопоставления, продолжая вызывать общую функцию:
match example_function(&mut count) {
Ok(result) => do_stuff(),
Err(_) => { println!("Error!"); do_stuff() },
}
Но краткий ответ: да, вы можете вызвать один и тот же код для ответа «ОК» или «Ошибка».
В первом примере пропущены запятые. После do_stuff() должны быть запятые.