我不明白这个 Rust 闭包语法

Def*_*her 1 rust

我目前正在阅读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|。我想知道为什么这段代码被认为对于函数调用有效。我的意思是,如果它只传递闭包作为参数,我很好,但我对前面的局部变量声明和外部花括号感到困惑。

您能解释一下吗?

caf*_*e25 9

{
    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绑定的操作,也不知道您在哪里感到困惑。