簡體   English   中英

如何在字符串字符的反向迭代器中從頭開始獲取索引?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM