gpt4 book ai didi

rust - 如何在字符串字符的反向迭代器中从头开始获取索引?

转载 作者:行者123 更新时间:2023-11-29 07:53:24 27 4
gpt4 key购买 nike

这段代码:

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 字符串,因为 char在 Rust 中代表:

The char type represents a single character. More specifically, since 'character' isn't a well-defined concept in Unicode, char is a 'Unicode scalar value', which is similar to, but not the same as, a '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。同时它有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 的枚举 char 迭代器编制索引,那您就只能靠自己了。

关于rust - 如何在字符串字符的反向迭代器中从头开始获取索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58926347/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com