Любые способы запустить ветку Ok, если при сопоставлении результат выдает Err

У меня есть ветвь сопоставления, которая теоретически разрешает условие ошибки (если оно у меня есть), и тогда я хотел бы выполнить любой код, который я написал в ветке 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 }
}
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
0
95
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я не думаю, что вы можете «перепрыгнуть» на другую соответствующую руку, но вы можете просто сначала обработать только случай 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() должны быть запятые.

Brian Horakh 24.05.2024 04:23

Другие вопросы по теме