我试图找到一种方法来检查我是否在for循环中迭代器的最后一个元素上,而不使用。clone();目前我正在做的是:
let sentence = "The quick brown fox.";
let words = sentence.split(' ');
let last = words.clone().last().unwrap();
for word in words {
if word == last {
print!("{}", word);
}
}
我也试过用。在迭代器上使用collect(),但这需要使用。iter().enumerate()检查最后一个索引,这对我来说似乎不必要地复杂:
let sentence = "The quick brown fox.";
let words: Vec<&str> = sentence.split(' ').collect();
for (i, word) in words.iter().enumerate() {
if i == words.len() - 1 {
print!("{}", word);
}
}
有没有一种更简洁的方法来做到这一点,也许只是使用原来的迭代器?
4条答案
按热度按时间p8ekf7hl1#
将迭代器转换为
Peekable
。这将需要将迭代去糖为
while let
,但如果在迭代过程中peek()
返回None
,则您处于最后一次迭代:Playground。
3okqufwl2#
对于有限迭代器的一般情况,如果你想得到最后一个元素,你可以像@Masklinn建议的那样(见他们的答案),转换为一个
Peekable
,它将缓冲,所以它总是知道下一个元素。在您的具体情况下,当您只想打印最后一个单词而不关心其他单词时,有一个更便宜的解决方案,因为在字符上分割实现了
DoubleEndedIterator
。所以很容易得到最后一个词,你不必收集整个分裂或列举。它也很快,因为字符串将从末尾开始搜索,并且不会复制任何东西。
所以你可以
dfddblmv3#
您可以利用
Iterator::map()
迭代器适配器来实现更方便的使用:这样,就不必处理循环体中的索引,只需关注特定迭代中的给定元素是否是最后一个。
6mw9ycah4#
我想补充@Masklinn的回答。
我使用了一个特性来使它更具可读性。
代码允许将
it.peek().is_none()
写成it.is_last()
。