rust - 为什么 Iterator::filter 方法接受可变引用作为 self?
问题描述
的签名Iterator::filter
是
fn filter<P>(self, predicate: P) -> Filter<Self, P>
where
Self: Sized,
P: FnMut(&Self::Item) -> bool,
因为它self
作为第一个参数,我假设我必须按值传递迭代器,从而将所有权转移到该函数。但是,我可以只用一个 ref mut 来调用它,并且代码会编译并运行。例如:
fn char_count(i: &mut impl Iterator<Item=char>, c: char) -> usize {
i.filter(|&x| c == x).count()
}
我在这里想念什么?
解决方案
这里的两个参数存在混淆。
该self
参数引用原始迭代器。也就是说,filter()
将原始迭代器的任何内容移动到新Filter
结构中,该结构获得该迭代器的所有权(Self
in Filter<Self, _>
)
是predicate
aFnMut
因为它不需要是Fn
。也就是说,as 提供的函数predicate
允许修改它在执行时捕获的上下文。这是可能的,因为它调用它时它Filter
本身并不借用。predicate
如果是这样,predicate
则必须是Fn(&Self::Item)
.
通过predicate
引用获取迭代器的项目。注意签名中的印记FnMut(&Self::Item)
。
推荐阅读
- mysql - MySQL 5.7 上的加密如何工作?
- oracle - 数据加载向导 - 转换规则不起作用
- javascript - 在 Highcharts 中,重新启用图表最右边的元素时,我的 dataLabels 消失了
- html - 单击 DIV 时在单选值之间切换
- json - 如何生成与数组和对象具有相同键和值的 JSON 请求有效负载?
- kotlin - ReceiveAll() 在 Corda 中的应用是什么?如何实施?
- java - 在 Java 11 上使用 Jetty Maven 插件 9.4.32.v20200930 获取类“FutureCallback”和“LazyList”的“NoClassDefFoundError”
- sql - 获取使用排序溢出的 SQL 语句
- computer-vision - 使用工具、表单识别器、自定义标签进行标记后,两个字段的准确性较低
- excel - 在选定目录 msoFileDialogFolderPicker 上方拉一个目录