我目前正在阅读dua-cli的源代码,遇到了一个函数调用,它需要一个满足Fn trait的参数。代码为:
type WalkDir = jwalk::WalkDirGeneric<((), Option<Result<std::fs::Metadata, jwalk::Error>>)>;
impl WalkOptions {
pub(crate) fn iter_from_path(&self, root: &Path, root_device_id: u64) -> WalkDir {
WalkDir::new(root)
.follow_links(false)
.sort(match self.sorting {
TraversalSorting::None => false,
TraversalSorting::AlphabeticalByFileName => true,
})
.skip_hidden(false)
.process_read_dir({
// I don't understand the following two lines
let ignore_dirs = self.ignore_dirs.clone();
let cross_filesystems = self.cross_filesystems;
move |_, _, _, dir_entry_results| {
// Closure logic here
}
})
}
}
process_read_dir函数签名为
pub fn process_read_dir<F>(self, process_by: F) -> Selfwhere
F: Fn(Option<usize>, &Path, &mut C::ReadDirState, &mut Vec<Result<DirEntry<C>>>) + Send + Sync + 'static,
在上面的代码中,函数调用并没有直接将闭包传递给process_read_dir。相反,它以两个用花括号括起来的局部变量的声明开始,后面是一个闭包move |_, _, _, dir_entry_results|
。我想知道为什么这段代码被认为对函数调用有效。我的意思是,如果它只传递闭包作为参数,我很好,但我混淆了前面的局部变量声明和外面的花括号。
你能解释一下吗?
1条答案
按热度按时间7cjasjjr1#
只是一个常规的block expression,就像Rust中的所有块一样,它的计算结果是其中的最后一个表达式(在本例中是闭包)。
这两个赋值只是简单的赋值,它们做的是所有
let
绑定所做的事情,也不知道您在哪里感到困惑。