在使用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]
游乐场