chars
имеет тип Chars
, который реализует ("является") итератор , элементы которого имеют тип char
.
В Rust вы можете использовать for
-loops для вещей, которые реализуют («являются») итератор .
Таким образом, ваш первый пример должен охватываться этим : Перебирает char
s.
Второй пример не работает, потому что &chars
имеет тип &Chars
(заимствованная, не изменяемая ссылка), который не внедряет Iterator
.
В третьем примере, однако, у вас есть &mut Chars
, и это итератор :
impl<I: Iterator + ?Sized> Iterator for &mut I {
type Item = I::Item;
fn next(&mut self) -> Option<I::Item> { (**self).next() }
// some details omitted
}
выше сказано: для любого типа I
, который является Iterator
и который может не удовлетворять ?Sized
(все это верно для типа Chars
), тип &mut I
является Iterator
, чьи повторяющиеся значения так же, как исходные итерированные типы (type Item = I::Item
) и делегирует next
(и некоторые другие методы) исходному итератору.
Таким образом, третий пример видит &mut Chars
, знает, что Chars
является * 104 7 *, и делает вывод, что тогда &mut Chars
также является Iterator
, который может использоваться в for
-l oop.
as_str
- в соответствии с его документация (см. пример там) дает вам оставшуюся (т. е. еще не повторенную) подстроку, поэтому после итерации она должна просто сказать ""
(т. е. пустой), так как не осталось ничего для итерации.