Rust Ok和Err
在Rust编程语言中,Ok和Err是Result枚举的两种可能值,这个枚举用于错误处理。Ok通常表示一个函数或操作成功完成,并且可以携带一个成功的结果值。下面是如何使用Ok的一些示例和常见场景:
返回类型声明
当你定义一个可能出错的函数时,你可以将其返回类型声明为Result
Rust
fn divide(numerator: i32, denominator: i32) -> Result{ if denominator == 0 { Err(String::from("Cannot divide by zero")) } else { Ok(numerator / denominator) } }
这里,如果除法成功,函数返回Ok(quotient),否则返回Err(error_message)。
使用match
你可以使用match语句来匹配Result的Ok和Err情况,以便分别处理成功和错误的情况:
Rust
fn main() { let result = divide(10, 2); match result { Ok(value) => println!("Result: {}", value), Err(e) => println!("Error: {}", e), } }
使用?运算符
在函数内部,你也可以使用?运算符来简化错误处理。如果函数调用返回一个Result,?会自动提取Ok中的值或者短路并返回Err:
Rust
fn calculate() -> Result{ let x = 10; let y = 0; let division_result = divide(x, y)?; Ok(division_result * 2) }
在上面的例子中,如果divide函数返回Err,那么calculate函数也会立即返回同一个Err,不会执行后续代码。
使用unwrap或expect
这些方法在Result上可用,用于获取Ok中的值。unwrap会在遇到Err时恐慌并终止程序,而expect允许你提供一个错误消息:
Rust
fn main() { let result = divide(10, 2); let value = result.unwrap(); println!("Result: {}", value); let result_with_error = divide(10, 0); let value_with_error = result_with_error.expect("Division should not fail"); // 这行代码永远不会执行,因为上面的expect会恐慌 }
使用组合器
Result实现了多个组合器,如map, and_then, ok_or, 等等,可以用来转换或链接多个Result。