Rust Ok和Err

作者: adm 分类: Rust 发布时间: 2024-07-15

在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。

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!