如何跳过循环中的最后一个字符串元素?
我的解决方案运行良好
fn main() {
let s = "123456".to_string();
for ch in (&s[..s.len()-1]).chars() { // skip the last element
println!("{}", ch);
}
}
但还有更好的吗?
类似于skip()
https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.skip
允许跳过循环中的第一个元素
您可以在开始迭代之前使用
next_back
(从DoubleEndedIterator
特征)显式删除最后一个字符:如果您需要删除多个字符,只需
next_back
在一个简单的范围循环中运行(如果您尝试跳过比现有字符更多的字符,可能会检查None
以允许您立即删除)。break
正如我在评论中指出的,您的解决方案在存在 UTF-8 字符的情况下并不安全,因为它可能会在单个 UTF-8 字符的字节之间进行切片。此解决方案是安全的,因为
next_back
可以正确解码并省略任何宽度的 UTF-8 字符。之所以不能在不从后向前操作的情况下执行此类操作,是因为可变宽度 UTF-8 字符意味着纯粹按正向顺序操作,Rust 不知道它何时是
x
从字符串末尾开始的字符,直到它出现为止。到达字符串的末尾(此时只有事后才知道)。即使它知道距离末尾有四个字节,它也可能是 1(单个四字节字符)、2(两个两字节字符)、3(两个单字符和一个两字节)或 4(四个单字符)字符只有预先知道其ExactSizeIterator
精确长度的 s 可以通过巧妙地使用rev
and来做到这一点skip
,而aDoubleEndedIterator
则.chars()
不能。因为
.len()
字符串返回字节数,而不是字符数,所以对于多字节字符,您的尝试将会失败。这里有一个建议:延迟打印即可。