Rust:fn foo()-> Result <()>抛出“期望的2个类型参数”

Pet*_*ron 6 error-handling rust

为什么Result<()>在编译这部分Rust代码时不被允许?Rust版本之间是否有重大变化?

fn run() -> Result<()> {
    let (tx, rx) = channel();

    thread::spawn(move || {
        do_things_with_tx(&exit_tx);
    });

    match exit_rx.recv() {
        Ok(result) => if let Err(reason) = result {
            return Err(reason);
        },
        Err(e) => {
            return Err(e.into());
        },
    }

    Ok(())
}
Run Code Online (Sandbox Code Playgroud)

编译器说:

error[E0107]: wrong number of type arguments: expected 2, found 1
    --> src/main.rs:1000:18
     |
1000 | fn run_wifi() -> Result<()> {
     |                  ^^^^^^^^^^ expected 2 type arguments
Run Code Online (Sandbox Code Playgroud)

当我将返回类型调整为时Result<(), Err>,它说:

error[E0107]: wrong number of type arguments: expected 2, found 0
    --> src/main.rs:1000:29
     |
1000 | fn run() -> Result<(), Err> {
     |                        ^^^ expected 2 type arguments
Run Code Online (Sandbox Code Playgroud)

这是来自wifi-connect项目。早晨将跟踪可重复的MVCE。

E_n*_*ate 13

的定义Result一直是以下定义:

pub enum Result<T, E> {
    Ok(T),
    Err(E),
}
Run Code Online (Sandbox Code Playgroud)

该定义甚至以Rust编程语言提供,以显示它的简单性。作为OK结果和错误结果的通用和类型,它总是期望两个类型参数,并且编译器会抱怨无法推断它们,或者类型参数列表没有预期的长度。

另一方面,可能会发现许多库和相应的文档显示了Result带有单个类型参数的,如中所示Result<()>。是什么赋予了?

仍然不是魔术。按照惯例,库在板条箱或模块级别为结果类型创建类型别名。这非常有效,因为对于那些产生相同的本地创建类型的错误是很常见的。

pub type Result<T> = Result<T, Error>;
Run Code Online (Sandbox Code Playgroud)

实际上,error-chain很多错误类型的辅助工具箱之一的crate 在使用error_chain!宏时会自动创建此定义,这一点非常普遍。因此,如果您在使用error-chainwifi-connect)的项目中,或者正在使用可能会或可能不会使用的库,则应error-chain假定提到的提及Result<T>是特定于域的本地类型别名Result<T, Error>。如有疑问,请在生成的文档页面中单击该类型,将您带到具体定义(在本例中为别名)。


E-r*_*ich 6

锈病编程语言部分的?运算符只能在返回结果的函数中使用

use std::error::Error;
use std::fs::File;

fn main() -> Result<(), Box<dyn Error>> {
    let f = File::open("hello.txt")?;

    Ok(())
}
Run Code Online (Sandbox Code Playgroud)