相关疑难解决方法(0)

为什么我会使用不同的功能?

通过Rust书阅读,我遇到了一个有趣的话题 - 不同的功能:

Rust有一些特殊的'分叉函数'语法,这些函数不返回:

fn diverges() -> ! {
    panic!("This function never returns!");
}
Run Code Online (Sandbox Code Playgroud)

发散功能可以用作任何类型:

let x: i32 = diverges();
let x: String = diverges();
Run Code Online (Sandbox Code Playgroud)

发散功能的用例是什么?这本书说的

panic!()导致当前执行的线程与给定的消息一起崩溃.因为此函数会导致崩溃,所以它永远不会返回,因此它具有类型!

这是有道理的,但我不能想到一个不同的功能将在哪里使用,它似乎非常本地化panic!.我知道必须有一些有用的场景,为什么他们引入了不同的功能.在Rust哪里可能会看到不同的功能?

rust

27
推荐指数
2
解决办法
2402
查看次数

如何告诉编译器我的函数终止程序如process :: exit()?

我有以下功能,包括一些错误恢复逻辑和process::exit(0)最后:

fn gracefully_shutdown() {
    // Do some logic for the recover
    process::exit(7);
}
Run Code Online (Sandbox Code Playgroud)

我想在错误的情况下调用该函数,但match抱怨incompatible arms.但是当我将它明确地写入匹配臂时,它不会抱怨,如下所示:

fn handle_result(my_result: Result<i32, MyError>) -> i32 {
    match my_result {
        Ok(val) => val,
        //Err(_error) => { process::exit(0); } // Does not complain
        Err(_error) => {
            gracefully_shutdown();
        } // Does complain
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器真的难以理解其本身gracefully_shutdown()包含process::exit(0)的内容吗?

我希望我能以这种方式编写代码:

fn handle_result(my_result: Result<i32, MyError>) -> i32 {
    match my_result {
        Ok(val) => val,
        Err(_error) => {
            gracefully_shutdown();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

任何使这项工作的想法? …

pattern-matching rust

5
推荐指数
1
解决办法
77
查看次数

我可以在发散函数中使用问号运算符(?)来返回永不类型(!)吗?

我正在为嵌入式项目编写Rust,而我的main函数签名是

#[entry]
fn main() -> !
Run Code Online (Sandbox Code Playgroud)

我知道这意味着它永远不会返回,而且我通常在main的末尾进入无限循环。

我想?在主要功能中使用try运算符,但无法在文档中搜索rust ? in !。我该如何用单词拼写出来?

我可以?() -> !功能中使用吗?

rust

0
推荐指数
1
解决办法
98
查看次数

标签 统计

rust ×3

pattern-matching ×1