为什么创建通知观察程序时收到"type annotations needed"错误?


let mut watcher = notify::recommended_watcher(|res: Result<_>| {
match res {
Ok(event) => {
match event.kind {
EventKind::Modify(ModifyKind::Metadata(_)) => { /* deal with metadata */ }
EventKind::Create(CreateKind::File) => { /* deal with new files */ }
EventKind::Other => { /* ignore meta events */ }
_ => { /* something else changed */ }
}
},
Err(e) => println!("watch error: {:?}", e)
}
})

这个代码块给了我错误:

error[E0282]: type annotations needed
--> src/main.rs:13:23
|
13 |                 match event.kind {
|                       ^^^^^ cannot infer type

Rust Explorer

这对我来说没有意义,因为notify的文档使用相同的代码,而没有在匹配中指定类型。

有人能解释一下发生了什么,以及我应该在哪里指定哪种类型才能让它发挥作用吗?

Rust有太多的间接层来推断Result<_>中的_占位符指的是什么类型。如果你告诉它_意味着Event:,它就会编译

use notify::Event;
let mut watcher = notify::recommended_watcher(|res: Result<Event>| {
match res {
Ok(event) => {
match event.kind {
EventKind::Modify(ModifyKind::Metadata(_)) => { /* deal with metadata */ }
EventKind::Create(CreateKind::File) => { /* deal with new files */ }
EventKind::Other => { /* ignore meta events */ }
_ => { /* something else changed */ }
}
},
Err(e) => println!("watch error: {:?}", e)
}
})

Rust Explorer

间接层包括:

  1. recommended_watcher的参数必须是实现EventHandler:的类型

    pub fn recommended_watcher<F>(event_handler: F) -> Result<RecommendedWatcher> 
    where
    F: EventHandler, 
    
  2. 接受Result<Event>但不返回任何内容的单参数函数是EventHandler:

    impl<F> EventHandler for F
    where
    F: FnMut(Result<Event>) + Send + 'static, 
    
  3. 因此,Result<_>必须是Result<Event>才能与签名FnMut(Result<Event>)相匹配。

相关内容

最新更新