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
间接层包括:
recommended_watcher
的参数必须是实现EventHandler
:的类型pub fn recommended_watcher<F>(event_handler: F) -> Result<RecommendedWatcher> where F: EventHandler,
接受
Result<Event>
但不返回任何内容的单参数函数是EventHandler
:impl<F> EventHandler for F where F: FnMut(Result<Event>) + Send + 'static,
因此,
Result<_>
必须是Result<Event>
才能与签名FnMut(Result<Event>)
相匹配。