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-chain(如wifi-connect)的项目中,或者正在使用可能会或可能不会使用的库,则应error-chain假定提到的提及Result<T>是特定于域的本地类型别名Result<T, Error>。如有疑问,请在生成的文档页面中单击该类型,将您带到具体定义(在本例中为别名)。
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)