我目前正在阅读dua-cli的源代码,并遇到一个需要满足 Fn 特征的参数的函数调用。代码是:
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
}
})
}
}
Run Code Online (Sandbox Code Playgroud)
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,
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,函数调用没有直接将闭包传递给process_read_dir。相反,它以声明两个用大括号括起来的局部变量开始,后跟一个闭包move |_, _, _, dir_entry_results|。我想知道为什么这段代码被认为对于函数调用有效。我的意思是,如果它只传递闭包作为参数,我很好,但我对前面的局部变量声明和外部花括号感到困惑。
您能解释一下吗?
{
let ignore_dirs = self.ignore_dirs.clone();
let cross_filesystems = self.cross_filesystems;
move |_, _, _, dir_entry_results| {
// Closure logic here
}
}
Run Code Online (Sandbox Code Playgroud)
只是一个正则块表达式,就像 Rust 中的所有块一样,它计算出其中的最后一个表达式,在本例中为闭包。
这两个作业只是简单的作业,它们执行所有let绑定的操作,也不知道您在哪里感到困惑。
| 归档时间: |
|
| 查看次数: |
110 次 |
| 最近记录: |