[英]How do I get the index from the beginning in a reversed iterator of chars of a string?
這段代碼:
let s = String::from("hi");
for (idx, ch) in s.chars().rev().enumerate() {
println!("{} {}", idx, ch);
}
印刷
0 i
1 h
但我想知道真正的索引,以便打印:
1 i
0 h
最好的方法是什么? 目前我只想得到.count()
並從中減去每個idx
,但也許有一個更好的方法被我忽略了。
正如他們所說,這很復雜。 如果您的字符串僅為 ASCII,您可以進行明顯的枚舉,然后針對String
的字節迭代器進行反轉:
fn main() {
let s = String::from("hi");
for (idx, ch) in s.bytes().enumerate().rev() {
println!("{} {}", idx, ch as char);
}
}
這通常不適用於 Unicode 字符串,因為 Rust 中的char
代表:
char
類型表示單個字符。 更具體地說,由於 'character' 在 Unicode 中不是一個明確定義的概念,因此 char 是一個'Unicode scalar value' ,它與'Unicode code point'相似但不相同。
這可以通過以下方式說明:
fn main() {
let s = String::from("y̆");
println!("{}", s.len());
for (idx, ch) in s.bytes().enumerate() {
println!("{} {}", idx, ch);
}
for (idx, ch) in s.chars().enumerate() {
println!("{} {}", idx, ch);
}
}
這個看起來很奇怪的字符串的長度為 3,如 3 u8
s。 同時它有 2 個char
。 所以ExactSizeIterator
不能簡單地為std::str::Chars
實現,但它可以並且確實為std::str::Bytes
實現。 這很重要,因為要反轉給定的迭代器,它必須是DoubleEndedIterator
:
fn rev(self) -> Rev<Self>
where
Self: DoubleEndedIterator,
但是DoubleEndedIterator
僅在底層迭代器也是ExactSizeIterator
時才可用於枚舉迭代器:
impl<I> DoubleEndedIterator for Enumerate<I>
where
I: ExactSizeIterator + DoubleEndedIterator,
總之,你只能做s.bytes().enumerate().rev()
,但不能s.chars().enumerate().rev()
。 如果您絕對必須以這種方式索引String
的枚舉字符迭代器,那么您只能靠自己了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.