为什么 Char 的迭代器会删除 Rust 中的元素?



在使用Chars类型时,我无意中发现了一些我没有预料到的东西。我调用了.next()方法,发现它正在改变原始的字符值。

在代码中说明并与在vec上调用next进行比较:

let mut c: Chars = "hello".chars();
dbg!(c.next()); // prints Some("h")
dbg!(c); // prints Chars(['e','l','l','o',])

可以看到,在调用next之后,h消失了,c的值现在是'e','l','l','o'

而对于vec,则不是这样:

let v1 = vec![1, 2, 3];
let mut v1_iter = v1.iter();
dbg!(v1_iter.next()); // prints Some(1)
dbg!(v1); // prints [1,2,3]

可以看出,调用next并不会使v1发生变异以移除1元素。

为什么Chars是这种情况?它是否展示了rust中某些类型的迭代器的良好定义的特征,而我没有意识到?它是迭代器,迭代实际上是消耗并改变被迭代的原始值?

你这是在拿苹果和橘子作比较。在一种情况下,您打印的是迭代器本身,而在另一种情况下,您打印的是原始容器。如果打印v1_iter,或者打印let s = "hello"; let c = s.chars();s,您会注意到它们的行为是相同的:

let s = "hello";
let mut c: Chars = s.chars();
dbg!(c.next()); // prints Some("h")
dbg!(c); // prints Chars(['e','l','l','o',])
dbg!(s); // prints "hello"
let v1 = vec![1, 2, 3];
let mut v1_iter = v1.iter();
dbg!(v1_iter.next()); // prints Some(1)
dbg!(v1_iter); // prints Iter ([ 2, 3, ],)
dbg!(v1); // prints [1,2,3]

游乐场

最新更新