rust - 为什么 Iterator::filter 方法接受一个可变引用作为 self?

标签 rust 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 中的 Filter<Self, _>)

predicateFnMut因为它不需要是 Fn .也就是说,提供的功能为 predicate允许修改它在执行时捕获的上下文。这是可能的,因为 Filter本身不借predicate当它调用它时。如果是,predicate必须是 Fn(&Self::Item) .

predicate通过引用获取迭代器的项。注意签名中的印记 FnMut(&Self::Item) .

关于rust - 为什么 Iterator::filter 方法接受一个可变引用作为 self?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68536664/

相关文章:

rust - 处理 stdin 上的 UTF-8 输入

macros - 如何获取宏重复单元素的索引

python - 当在另一个函数(self)中声明函数(self)时,“self”丢失了一些东西

enums - 在枚举方法中改变 self

python - (Python) 通过单选按钮 python 更新背景

iOS:使用 self 和带变量的下划线(_)

rust - 从 tokio 任务中排出 Vec<_>

rust - 如何使用 Rustup 删除 Rust 编译器工具链?

Rust 读取 csv 时输入错误

Python - self ,没有 self 和 cls