На данный момент создание другой функции (или лямбды, как у вас) является практически единственным способом go.
Если вы действительно часто используете это, вы можете сделать его обобщенным c функция:
fn stuff() -> Result<Quux, Error> {
with_error_context("stuff() failed", || {
let a = foo()?;
let b = bar()?;
let c = baz()?;
quux(&a, &b, &c)?
})
}
fn with_error_context<T, E, F: FnOnce() -> Result<T, E>>(
message: &str, f: F
) -> Result<T, E> {
f().context(message)
}
Существует также нестабильная на данный момент функция try_blocks
, которая позволит вам написать что-то вроде:
fn stuff() -> Result<Quux, Error> {
try {
let a = foo()?;
let b = bar()?;
let c = baz()?;
quux(&a, &b, &c)?
}.context("stuff() failed")
}