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, _>
)
predicate
是 FnMut
因为它不需要是 Fn
.也就是说,提供的功能为 predicate
允许修改它在执行时捕获的上下文。这是可能的,因为 Filter
本身不借predicate
当它调用它时。如果是,predicate
必须是 Fn(&Self::Item)
.
predicate
通过引用获取迭代器的项。注意签名中的印记 FnMut(&Self::Item)
.
关于rust - 为什么 Iterator::filter 方法接受一个可变引用作为 self?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68536664/