Error handling fn foo()->;结果<;()>;抛出;应为2个类型参数“;

Error handling fn foo()->;结果<;()>;抛出;应为2个类型参数“;,error-handling,rust,Error Handling,Rust,为什么编译这段代码时不允许Result?这是两个版本之间的突破性变化吗 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
?这是两个版本之间的突破性变化吗

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(())
}
fn run()->结果{
let(tx,rx)=信道();
线程::生成(移动| |{
使用发送做事情(退出发送);
});
匹配出口_rx.recv(){
Ok(结果)=>如果让错误(原因)=结果{
返回错误(原因);
},
错误(e)=>{
返回Err(如into());
},
}
好(())
}
编者说:

error[E0107]:类型参数的数量错误:应为2,找到1
-->src/main.rs:1000:18
|
1000 | fn运行_wifi()->结果{
|^^^^^^^^^^^^^应为2个类型参数
当我将返回类型调整为
Result
时,它会显示:

error[E0107]:类型参数数量错误:应为2,找到0
-->src/main.rs:1000:29
|
1000 | fn run()->结果{
|^^^应为2个类型参数

这来自于。

结果的定义是,并且一直是,如下所示:

pub enum Result<T, E> {
    Ok(T),
    Err(E),
}
或者,一个仍然可以声称为原始结果类型的定义

pub type Result<T, E = Error> = Result<T, E>;
pub type Result=Result;
此模式非常常见,一些错误帮助器板条箱(如)将自动为声明的每个错误创建结果别名类型。 因此,如果您使用的库可能使用也可能不使用
错误链
,则您应假定提及的
结果
是特定于域的
结果
的本地类型别名。如有疑问,在生成的文档页面中单击该类型将引导您找到具体定义(在本例中,别名)。

来自第节

使用std::error::error;
使用std::fs::File;
fn main()->结果{
让f=File::open(“hello.txt”)?;
好(())
}

Rust follow semver,破坏更改意味着主要版本会生锈,因此如果你真的发现了回归,那就是一个bug。如果你能创建一个并指定两个显示回归的生锈版本,那么我就发现了一个问题,我找不到任何关于你当前打开的案例的信息。你在这里使用的是什么
Result
类型?
std::Result::Result
总是期望有两种类型的参数,而例如
std::io::Result
只需要一个。在最后一种情况下,您在这个
Result
中输入的
Err
类型是什么?我只是在Rust Cookbook的目录遍历示例中点击了这个:
pub type Result<T, E = Error> = Result<T, E>;
use std::error::Error;
use std::fs::File;

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

    Ok(())
}