`filter(func)` 和 `filter(|x| func(x))` 有什么区别?

2023-11-24

有什么区别filter(|x| func(x)) and filter(func)?也许一个好的起点是了解如何filter(func)可以使用类似于以下的语法来编写filter(|x| func(x))。我的代码如下所示:

fn filter_out_duplicates(vec_of_vecs: Vec<Vec<u8>>) -> Vec<Vec<u8>> {
  vec_of_vecs
     .into_iter()
     .filter(all_unique)
     .collect()
}

pub fn all_unique<T>(iterable: T) -> bool
where
   T: IntoIterator,
   T::Item: Eq + Hash,
{
   let mut unique = HashSet::new();
   iterable.into_iter().all(|x| unique.insert(x))
}
error[E0599]: the method `collect` exists for struct `Filter<std::vec::IntoIter<Vec<u8>>, fn(&Vec<u8>) -> bool {tmp::all_unique::<&Vec<u8>>}>`, but its trait bounds were not satisfied
  --> src/main.rs:44:56
   |
44 |             vec_of_vecs.into_iter().filter(all_unique).collect()
   |                                                        ^^^^^^^ method cannot be called on `Filter<std::vec::IntoIter<Vec<u8>>, fn(&Vec<u8>) -> bool {tmp::all_unique::<&Vec<u8>>}>` due to unsatisfied trait bounds
   |
  ::: /.rustup/toolchains/stable-x86_64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/adapters/filter.rs:15:1
   |
15 | pub struct Filter<I, P> {
   | ----------------------- doesn't satisfy `_: Iterator`
   |
   = note: the following trait bounds were not satisfied:
           `<fn(&Vec<u8>) -> bool {tmp::all_unique::<&Vec<u8>>} as FnOnce<(&Vec<u8>,)>>::Output = bool`
           which is required by `Filter<std::vec::IntoIter<Vec<u8>>, fn(&Vec<u8>) -> bool {tmp::all_unique::<&Vec<u8>>}>: Iterator`
           `fn(&Vec<u8>) -> bool {tmp::all_unique::<&Vec<u8>>}: FnMut<(&Vec<u8>,)>`
           which is required by `Filter<std::vec::IntoIter<Vec<u8>>, fn(&Vec<u8>) -> bool {tmp::all_unique::<&Vec<u8>>}>: Iterator`
           `Filter<std::vec::IntoIter<Vec<u8>>, fn(&Vec<u8>) -> bool {tmp::all_unique::<&Vec<u8>>}>: Iterator`
           which is required by `&mut Filter<std::vec::IntoIter<Vec<u8>>, fn(&Vec<u8>) -> bool {tmp::all_unique::<&Vec<u8>>}>: Iterator`
           which is required by `&mut Filter<std::vec::IntoIter<Vec<Placement>>, fn(&Vec<Placement>) -> bool {all_unique::<&Vec<Placement>>}>: Iterator`

但是如果我使用代码可以编译|x| all_unique(x)。我知道破译编译器错误是解决 Rust 问题的推荐方法,但我发现这个错误非常难以理解。

我找到了一个讨论这似乎比解释强制更同情这个错误,但我发现关于强制的章节Rustonomicon 中的内容太短,无法提供理解。


本案与胁迫无关。这是另一个案例晚绑定生命周期与早绑定生命周期.

Rust 有两种生命周期:早期绑定 and 晚绑定。差异归结为决定使用哪个生命周期。

对于晚绑定生命周期,你会得到一个更高等级的特质绑定- 就像是for<'a> fn(&'a i32)。然后,仅在调用该函数时才选择生命周期。

另一方面,对于早期束缚的生命周期,你会得到fn(&'some_concrete_lifetime i32)。生命周期可以被推断,有时被省略,但它确实存在。并且必须在我们决定函数指针/项的类型时决定。

filter()期望 HRTB 函数,即具有晚绑定寿命。这是因为脱糖FnMut(&Self::Item) -> bool, 这是边界filter(), is for<'a> FnMut(&'a Self::Item) -> bool,或者,如果你愿意的话,for<'a> FnMut<(&'a Self::Item,), Output = bool>.

Your all_unique(),然而,是通用的T: IntoIterator。如果我们设置T = &'a Vec<u8>, then 'a是早期绑定的。这是因为泛型参数的生命周期总是早期绑定的——本质上,因为我们不能后期绑定泛型参数,因为 Rust 中没有办法表达for<T>,因为泛型类型参数是单态的,所以这通常是不可能的。

因此,如果我们揭示被省略的生命周期,您想要满足特征界限fn(&'some_lifetime Vec<u8>) -> bool: for<'all_lifetimes> FnMut(&'all_lifetimes Vec<u8>) -> bool,并且这个界限是假的。这就是您看到的错误的原因。

然而,如果我们使用闭包,我们会生成一个特定于该类型的闭包&'lifetime Vec<u8>。由于它在类型上不是通用的,因此生命周期可以被后期绑定。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

`filter(func)` 和 `filter(|x| func(x))` 有什么区别? 的相关文章

随机推荐

  • “控制器”是命名空间,但像类型一样使用

    当我创建新控制器时总是抛出错误 Controller 是命名空间 但像类型一样使用 我不知道如何修复它 我已经安装了该包 在此输入图像描述 将文件夹名称更改为 Controllers 将命名空间更改为 Controllers 因此您的代码应
  • 未复制引用的项目依赖项 DLL

    我的项目解决方案目前有三个项目 我的项目 这是我的主要启动项目 使用 NET Framework 4 7 WPF 特定于 UI 我的项目 核心 类库 NET Standard 2 0 保存模型以及所有 幕后 数据 我的项目 关系 类库 NE
  • SwiftUI 更新核心数据对象更改视图

    我遇到的问题是 当我从工作表视图更新核心数据资产对象时 更改不会反映在 AssetListView 的 UI 中 请注意 从工作表视图插入新对象does刷新 AssetListView 的 UI 删除工作表视图中的对象也刷新AssetLis
  • 在jsp中显示日期差异

    我在数据库中有一个日期字段 仅存储日期而不存储时间 现在我想知道在 jsp 页面中显示当前日期和我的日期字段的天数差异 所以我应该喜欢 databaseDate 2012 11 30 currentDate 2012 11 27 3 day
  • MS Access 编程概述 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我是一名 Java EE 开发人员 刚刚有人联系我 希望我为他的业务提供一个可以与他们的 MS Access 后端 集成的应用程序的报价 我希望发布
  • 为什么 XML 中的节点顺序很重要?

    我最近一直在处理一个 API 它要求 XML 文档的节点按特定顺序排列 我想知道为什么他们觉得有必要强制执行这一点 而我完全找不到理由让事情变成这样 例如 这是正确的 xml 大大简化
  • 将 exe 从一个项目复制到另一个项目的调试输出目录

    我有两个项目 ProjOne exe 和 ProjTwo exe 我想构建 ProjOne exe 它知道它依赖于 ProjTwo exe 因此它在构建 ProjOne exe 时会复制 ProjTwo exe 我还有一个 ProjThre
  • jQuery:当div变得可见时如何为其绑定事件?

    我有一个 div 元素 div Tab data div 当这个 div 变得可见时如何绑定自定义事件 获取display block 而且我想在这个 div 变得不可见时绑定一个事件 获取display none 我想用 jQuery 来
  • 如何将列添加到架构的开头?

    Dataset withColumn 似乎将该列附加到架构的末尾 如何将列添加到架构的开头 Use select带通配符 df select new column col
  • FragmentActivity 与 ViewPager:方向更改时崩溃

    我在FragmentActivity中使用了ViewPager 当方向改变时我会崩溃 Override protected void onCreate Bundle savedInstanceState super onCreate sav
  • ShaderTextureLod参数值?

    LOD参数取什么值纹理洛德 我找到的规范根本没有提到这一点 是百分比还是带百分比的指数值 如果是后者 有没有办法获取纹理的 mipmap 数量 以便我能够使用百分比 LOD参数指定 mipmap 级别 四舍五入到最接近的整数 请记住 Ope
  • Docker 和 XDebug 不读取断点 VSCode

    过去 6 个月 我一直在 MAC 上使用 XDebug 和 PHP 7 0 版本 对 Docker 容器进行远程调试 我正在运行旧版本的 docker 它使用 VirtualBox 来为 docker 建立虚拟机 一切正常 我最近将 doc
  • 无法解决 PyCaret 的导入错误

    我试图通过在 anaconda python 3 8 中创建环境来安装 pycaret 一切都很好 除了当我试图从pycaret classification import 尽管我已经安装了所有依赖项 但我还是显示错误 ImportErro
  • 列出用户定义的变量,python

    我正在尝试迭代 python 脚本中设置的变量 我遇到了以下情况 枚举或列出 此处您最喜欢的语言 程序中的所有变量 在第一个例子中 us bin python foo1 Hello world foo2 bar foo3 1 a 2 b f
  • 使用命令和工厂设计模式来执行排队作业

    我有一个在数据库中排队的作业列表 我需要从数据库中读取这些作业并使用线程并行执行它们 并且我有一个命令类列表来执行每个作业 所有这些作业都实现了通用接口 命令模式 但是当我从数据库检索待处理的作业时 我需要为每个作业实例化正确的命令对象 如
  • 获取具有固定宽度的多行文本的高度以使对话框正确调整大小

    我想创建一个对话框 其中包含某种多行文本元素 JLabel JTextArea 等 并换行 我希望对话框具有固定宽度 但根据文本大小调整高度 我有这个代码 import static javax swing GroupLayout DEFA
  • LINQ 中的动态 where 条件

    我有一个场景 我必须在 LINQ 中使用动态 where 条件 我想要这样的东西 public void test bool flag from e in employee where e Field
  • 在 Objective-C 中创建整数属性数组

    我在 Objective C 中创建整数数组的属性时遇到问题 我不确定这是否可以在 Obj C 中做到 所以我希望有人可以帮助我找出如何正确地做到这一点或提供替代解决方案 myclass h interface myClass NSObje
  • 如何分析在生产服务器上运行的 ASP.NET 应用程序?

    我有一个 ASP NET 应用程序 在生产服务器上始终使用 75 100 的 CPU 如何分析应用程序以找出代码的哪一部分占用了最多的 CPU 我研究了几种不同的工具 Xte Profiler EQATEC dotTrace 但它们似乎都希
  • `filter(func)` 和 `filter(|x| func(x))` 有什么区别?

    有什么区别filter x func x and filter func 也许一个好的起点是了解如何filter func 可以使用类似于以下的语法来编写filter x func x 我的代码如下所示 fn filter out dupl