我不理解Rust的闭包语法

x8diyxa7  于 2023-05-17  发布在  其他
关注(0)|答案(1)|浏览(155)

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

7cjasjjr

7cjasjjr1#

{
    let ignore_dirs = self.ignore_dirs.clone();
    let cross_filesystems = self.cross_filesystems;
    move |_, _, _, dir_entry_results| { 
        // Closure logic here
    }
}

只是一个常规的block expression,就像Rust中的所有块一样,它的计算结果是其中的最后一个表达式(在本例中是闭包)。
这两个赋值只是简单的赋值,它们做的是所有let绑定所做的事情,也不知道您在哪里感到困惑。

相关问题