为什么Iterator :: all都需要迭代器是可变的?

正义制造者

我在String的字符上使用了迭代器

pub fn is_yelling(message: &str) -> bool {
    let letters = message.chars().filter(|c| c.is_alphabetic());
    message.chars().any(|c| c.is_alphabetic()) && letters.all(|c| c.is_uppercase())
}

这会引发编译错误:

error[E0596]: cannot borrow immutable local variable `letters` as mutable
 --> src/main.rs:3:51
  |
2 |     let letters = message.chars().filter(|c| c.is_alphabetic());
  |         ------- consider changing this to `mut letters`
3 |     message.chars().any(|c| c.is_alphabetic()) && letters.all(|c| c.is_uppercase())
  |                                                   ^^^^^^^ cannot borrow mutably

当我变得letters可变时,一切都会顺利进行。

我不明白为什么这样做是必要的。all方法不必更改迭代器。mapfilter,以self和不mut self作为参数。

map/ filter/的参考all

我在此问题上看到了一个问题,但未给出任何解释。

Shepmaster

迭代任何事情都需要更改迭代器,因为Iterator::nextTakes &mut self检查迭代器中的所有值都需要迭代,因此Iterator::all(以及许多类似方法)也需要迭代&mut self

all方法不必更改迭代器。

我非常有兴趣听到您建议如何在调用的情况下检查迭代器中的每个值next

喜欢mapfilter

这些方法返回一个新的迭代器,它们不会调用next话虽如此,他们可以,因为...

其采取self和不mut self作为参数。

可变性是变量所有者的属性。这两个功能是等效的:

fn example(mut a: String) {}
fn example(a: String) {
    let mut a = a;
}

重要的是,两者在生成的文档中看起来相同-mut签名中都没有这是因为它与调用方无关。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么Iterator :: all对于空的迭代器都返回true?

为什么for循环不需要可变的迭代器?

为什么Java的Iterator不可迭代?

为什么 std::vector::iterator 不是连续迭代器?

为什么 std::reverse_iterator 比直接迭代器慢?

为什么不能将`&Iterator <Item =&String>`用作迭代器?

为什么iterator.next()每次都返回相同的项目?

为什么`Iterator.find()`需要一个可变的`self`引用?

为什么不能将迭代器应用于接受const_iterator引用的函数?

为什么map,foreach和reduce在Symbol.iterator上不使用迭代器功能?

为什么Iterator :: take_while拥有迭代器的所有权?

我们为什么不实现Iterator的所有功能来实现迭代器?

为什么 for 循环不要求迭代器是可变的?

为什么迭代器需要用尽并丢弃?

为什么并行的for_each需要前向迭代器?

为什么迭代器需要默认可构造

为什么迭代器需要是CopyConstructible和CopyAssignable的?

为什么斯科特·迈耶斯(Scott Meyers)建议比起const_iterator更喜欢使用“迭代器”

为什么在迭代过程中看不到Iterator的修改?

为什么在iterator_apply示例中需要第三个参数

为什么* _iterators在删除std :: iterator后仍然需要typedef无效?

Swift - Sequence - 为什么我不需要为 Element 和 Iterator 添加类型别名?

为什么std :: for_each迭代器需要一个可复制构造的迭代器

为什么编译器不抱怨迭代器移动到for循环是不可变的?

为什么by_ref不能阻止.all使用迭代器?

为什么迭代器vector :: insert在填充后无效:迭代器插入(const_iterator位置,size_type n,const value_type&val);

readelf与objdump:为什么都需要

为什么我们同时需要迭代和迭代器概念?

为什么LinkedList可变迭代器没有`remove_next`方法?