公司网站维护一般需要做什么,网站顶部代码,大连网站开发选领超科技,网站建设电话话术在Rust中有一个特殊的角色Result#xff0c;是最常用的返回内容#xff0c;如果是从其他语言转到Rust的话会觉得很别扭#xff0c;很不习惯去处理Result#xff08;至少我是这样的#xff09;#xff0c;所以今天整理一下在Rust中如何处理Result#xff0c;也是自我整理…在Rust中有一个特殊的角色Result是最常用的返回内容如果是从其他语言转到Rust的话会觉得很别扭很不习惯去处理Result至少我是这样的所以今天整理一下在Rust中如何处理Result也是自我整理一下。 在说明之前需要先准备一段测试源代码
//执行返回Ok的result内容
fn rtn_ok() - Resulti32, String {Ok(0)
}//执行返回Err
fn rtn_err() - Resulti32, String {Err(failed..to_string())
}
使用match
使用match的方式针对Ok 、 Err 进行分支匹配即通过对返回的Result进行判断成功了该如何做失败了该如何做使用方式如下
let result rtn_ok();match result {Ok(value) println!(match Result is OK: {}, value),Err(error) println!(match Error: {}, error),}let result rtn_err();match result {Ok(value) println!(match Result is OK: {}, value),Err(error) println!(match Error: {}, error),}
如果放在main函数中执行返回结果如下
match Result is OK: 0
match Error: failed.
使用if let
是通过条件格式进行赋值判断分支
// use if letlet result rtn_ok();if let Ok(value) result { println!(if let Result is OK: {}, value);} else if let Err(error) result {println!(if let Error: {}, error);}let result rtn_err();if let Ok(value) result {println!(if let Result is OK: {}, value);} else if let Err(error) result {println!(if let Error: {}, error);}
执行结果如下
if let Result is OK: 0
if let Error: failed.
使用unwrap和expect
在使用unwrap 和 expect的时候如果返回值是错误Err在运行期间会发生panic所以直接在main函数中使用要小心。
// use unwrap or expectlet value rtn_ok().unwrap();println!(unwrap Result is OK: {}, value);let value rtn_ok().expect(expect error);println!(expect Result is OK: {}, value);
运行结果如下
unwrap Result is OK: 0
expect Result is OK: 0
如果运行期间返回Err会提示panic
thread main panicked at src/main.rs:58:27:
called Result::unwrap() on an Err value: failed.
note: run with RUST_BACKTRACE1 environment variable to display a backtrace
使用‘?’
这个?使用方式有点特别如果在main() 函数中直接使用并且函数返回值不为Result的话会提示异常 测试代码为
let value rtn_ok()?;
运行的话会提示如下错误
67 | let value rtn_ok()?;| ^ cannot use the ? operator in a function that returns ()| help: the trait FromResidualResultInfallible, String is not implemented for ()
这个错误起初我理解错了 以为使用的话返回值必须是()而事实上并不是要求rtn_ok()这个函数返回值得问题 而是使用所在的函数体返回值必须是Result假设我们添加如下测试源码
fn rtn_ok_kh(i: i32) - Resulti32, String {if i 0 {Ok(0)} else {Err(rtn error kh.to_string())}
}fn rtn_info(i: i32) - Resulti32, String {let value rtn_ok_kh(i)?;println!(? value is: {}, value);Ok(value)
}
上面的代码中可以看到 rtn_info中对rtn_ok_kh()函数使用了“?”,当rtn_ok_kh返回Ok时 可以正常赋值到value返回Err时直接返回异常main函数中测试代码如下
let result rtn_info(0); if let Ok(value) result {println!(? Result is OK: {}, value);} else if let Err(error) result {println!(? Error: {}, error);}let result rtn_info(3);if let Ok(value) result {println!(? Result is OK: {}, value);} else if let Err(error) result {println!(? Error: {}, error);}
执行后返回数据为
? value is: 0
? Result is OK: 0
? Error: rtn error kh
以上例子就能够看出“?”的使用方案了