如何创建一个iter重复最后一个元素?
例如:
[1, 2, 3] => [1, 2, 3, 3, 3, ...]
我的尝试
fn main() {
let v = vec![1, 2, 3];
let mut vi = v.iter().chain(repeat(v[v.len()]));
println!("{}", vi.next().unwrap())
}error[E0271]: type mismatch resolving `<std::iter::Repeat<{integer}> as std::iter::IntoIterator>::Item == &{integer}`
--> projects\notedown-ast\src\traits\to_html.rs:120:27
|
120 | let mut vi = v.iter().chain(repeat(v[v.len()]));
| ^^^^^ expected integer, found `&{integer}`
error[E0599]: no method named `next` found for struct `std::iter::Chain<std::slice::Iter<'_, {integer}>, std::iter::Repeat<{integer}>>` in the current scope
--> projects\notedown-ast\src\traits\to_html.rs:121:23
|
121 | println!("{}", vi.next().unwrap())
| ^^^^ method not found in `std::iter::Chain<std::slice::Iter<'_, {integer}>, std::iter::Repeat<{integer}>>`
|
= note: the method `next` exists but the following trait bounds were not satisfied:
`std::iter::Chain<std::slice::Iter<'_, {integer}>, std::iter::Repeat<{integer}>> : std::iter::Iterator`
error: aborting due to 2 previous errors发布于 2020-02-17 11:59:54
v.iter()是引用的迭代器,而repeat是值本身的迭代器。另外,向量的最后一个元素是v[v.len() - 1]。
为了使它发挥作用:
use std::iter::repeat;
fn main() {
let v = vec![1, 2, 3];
let mut vi = v.iter().chain(repeat(&v[v.len() - 1]));
println!("{}", vi.nth(10).unwrap());
}发布于 2020-02-17 14:06:08
以下是一个通用的实现:
struct LastRepeatIter<I>
where
I: Iterator,
I::Item: Clone,
{
it: I,
next: Option<I::Item>,
last: bool,
}
impl<I> LastRepeatIter<I>
where
I: Iterator,
I::Item: Clone,
{
fn new<It>(it: It) -> Self
where
It: IntoIterator<IntoIter = I, Item = I::Item>,
{
LastRepeatIter {
it: it.into_iter(),
next: None,
last: false,
}
}
}
impl<I> Iterator for LastRepeatIter<I>
where
I: Iterator,
I::Item: Clone,
{
type Item = I::Item;
fn next(&mut self) -> Option<Self::Item> {
if !self.last {
match self.it.next() {
None => self.last = true,
Some(next) => self.next = Some(next),
}
}
self.next.clone()
}
}
#[test]
fn it_works() {
let mut it = LastRepeatIter::new(vec![1, 2, 3]);
assert_eq!(it.next(), Some(1));
assert_eq!(it.next(), Some(2));
assert_eq!(it.next(), Some(3));
assert_eq!(it.next(), Some(3));
assert_eq!(it.next(), Some(3));
}在每次迭代时,代码检查是否有下一项:
next字段中,last标志为true。。
https://stackoverflow.com/questions/60261769
复制相似问题