likes
comments
collection
share

Rust:从不返回的never type

作者站长头像
站长
· 阅读数 19

1. 什么是never type

never type的存在使开发人员的意图更加清晰,使其他人能够清楚地理解开发人员的意图,而不必从偶然的线索中重建意义

never type,也称为!类型,是Rust中一种特殊的类型,表示一个永远不会返回的函数或表达式。用不用的其实都不影响代码,只是类似于一个标记。用来说明函数没有返回值。

fn foo() -> ! {
    panic!("This call never returns.");
}

在上面的代码中,函数foo的返回类型为!,表示该函数永远不会返回。

2. never type的语法

never type的语法非常简单,只需要在函数或表达式的返回类型处使用!符号即可。

fn bar() -> ! {
    loop {
        // do something
    }
}

在上面的代码中,函数bar的返回类型也为!,因为该函数包含一个无限循环,所以它永远不会返回。

3. never type的用途

当我们使用Result<T, !>时,它意味着这个操作永远不会失败,因为!类型表示一个永远不会返回的值。由于错误永远不会发生,因此我们可以安全地忽略Err变量。

同样,当我们使用Result<!, E>时,它意味着这个操作永远不会成功,因为!类型表示一个永远不会返回的值。由于成功永远不会发生,因此我们可以安全地忽略Ok变量。

下面是一个使用Result<T, !>的示例:

fn divide(a: i32, b: i32) -> Result<i32, !> {
    if b == 0 {
        panic!("Division by zero!");
    } else {
        Ok(a / b)
    }
}

fn main() {
    let result = divide(4, 2);
    match result {
        Ok(value) => println!("Result: {}", value),
        Err(_) => unreachable!(),
    }
}

在上面的代码中,函数divide用于计算两个整数相除的结果。如果除数为0,则调用panic!宏触发一个运行时错误。由于panic!宏永远不会返回,所以它的返回类型为!

4. never type与其他类型的区别

never type与其他类型最大的区别在于它表示一个永远不会返回的函数或表达式。这意味着使用never type的函数或表达式永远不会产生任何值。

let x: i32 = panic!("This call never returns.");

在上面的代码中,变量x被赋值为一个永远不会返回的表达式。由于该表达式永远不会产生任何值,所以这段代码是无效的。

5. never type在实际编程中的应用示例

下面是一个使用never type进行错误处理的示例:

enum MyError {
    DivisionByZero,
}

fn safe_divide(a: i32, b: i32) -> Result<i32, MyError> {
    if b == 0 {
        Err(MyError::DivisionByZero)
    } else {
        Ok(a / b)
    }
}

fn main() {
    match safe_divide(4, 2) {
        Ok(result) => println!("Result: {}", result),
        Err(MyError::DivisionByZero) => panic!("Division by zero!"),
    }
}

在上面的代码中,我们定义了一个枚举类型MyError来表示可能发生的错误。函数safe_divide用于安全地计算两个整数相除的结果。如果除数为0,则返回一个错误;否则返回计算结果。

在主函数中,我们使用模式匹配来处理可能发生的错误。如果发生除零错误,则调用panic!宏触发一个运行时错误。

never type是Rust中一种特殊的类型,表示一个永远不会返回的函数或表达式。它可以用于多种场景,例如错误处理、无限循环等。 from刘金,转载请注明原文链接。感谢!

转载自:https://juejin.cn/post/7231169018790363192
评论
请登录