我有一个调用另一个函数的函数,它返回一个 Result
。我需要检查这个 Result
是否为 Ok
或 Err
,如果是 Err
,我需要从我的函数中提前 return
。目前我正在做的是:
match callable(&mut param) {
Ok(_v) => (),
Err(_e) => return,
};
有没有更符合 Rust 语言习惯的方法来完成这个任务?
我有一个调用另一个函数的函数,它返回一个 Result
。我需要检查这个 Result
是否为 Ok
或 Err
,如果是 Err
,我需要从我的函数中提前 return
。目前我正在做的是:
match callable(&mut param) {
Ok(_v) => (),
Err(_e) => return,
};
有没有更符合 Rust 语言习惯的方法来完成这个任务?
macro_rules! unwrap_or_return {
( $e:expr ) => {
match $e {
Ok(x) => x,
Err(_) => return,
}
}
}
fn callable(param: &mut i32) -> Result<i32, ()> {
Ok(*param)
}
fn main() {
let mut param = 0;
let res = unwrap_or_return!(callable(&mut param));
println!("{:?}", res);
}
请注意,我不建议丢弃错误。Rust的错误处理非常人性化,因此即使只是为了记录错误,我也会返回该错误:
fn callable(param: &mut i32) -> Result<i32, ()> {
Ok(*param)
}
fn run() -> Result<(), ()> {
let mut param = 0;
let res = callable(&mut param)?;
println!("{:?}", res);
Ok(())
}
fn main() {
if let Err(()) = run() {
println!("Oops, something went wrong!");
}
}
return
还是continue
。这在Rust中是否通俗易懂? - Josh Abraham?
运算符有什么区别? - Paul Razvan BergResult
的run()
,增加间接性是一个好主意,原因有两个:1)在run()
内部,您可以使用?
来处理错误返回;2)然后您可以在单个位置记录/处理所有错误返回。在我看来,这比创建宏更好。 - user1783732foo
返回(),而我们仍然想使用?在foo
内部进行早期返回时,最好添加一层bar() -> Result()
,其中包括允许?早期返回的实际代码,然后foo
将调用bar
并记录错误。 - user1783732Rust 1.65.0 已经稳定支持 let-else 语句,它使您能够编写以下代码:
let Ok(_v) = callable(&mut param) else { return };
Option<T>
的常用方法,因为我知道我的 else
块实际上没有任何操作。但对于 Result<O, Error>
,我使用 OP 的方法,因为我想在将其返回之前记录错误对象到日志中。 - Fred DrakeResult<doesn't matter, same T>
,你只需要在调用行的末尾加上一个?
。fn caller() -> Result<Str, i32> {
let number = job()?; // <-- if job return error this function return/end here
// otherwise the value of Ok will assign to number
Ok(format!("the number is {}", number))
}
fn job() -> Result<i32, i32> {
// do something
Err(3)
}
Option<T>
。Err(_e) => return,
- Shepmasterunwrap_or_ok!(callable(&mut param), _, return);
let v = unwrap_or_ok!(callable(&mut param), error, return error);