Tôi gặp sự cố khi thể hiện tuổi thọ của giá trị trả lại của triển khai Iterator
. Làm thế nào tôi có thể biên dịch mã này mà không thay đổi giá trị trả về của trình lặp? Tôi muốn nó trả về một vectơ tham chiếu.Làm cách nào để viết một trình lặp mà trả về các tham chiếu đến chính nó?
Rõ ràng là tôi không sử dụng thông số trọn đời chính xác nhưng sau khi thử nhiều cách khác nhau mà tôi đã từ bỏ, tôi không biết phải làm gì với nó.
use std::iter::Iterator;
struct PermutationIterator<T> {
vs: Vec<Vec<T>>,
is: Vec<usize>,
}
impl<T> PermutationIterator<T> {
fn new() -> PermutationIterator<T> {
PermutationIterator {
vs: vec![],
is: vec![],
}
}
fn add(&mut self, v: Vec<T>) {
self.vs.push(v);
self.is.push(0);
}
}
impl<T> Iterator for PermutationIterator<T> {
type Item = Vec<&'a T>;
fn next(&mut self) -> Option<Vec<&T>> {
'outer: loop {
for i in 0..self.vs.len() {
if self.is[i] >= self.vs[i].len() {
if i == 0 {
return None; // we are done
}
self.is[i] = 0;
self.is[i - 1] += 1;
continue 'outer;
}
}
let mut result = vec![];
for i in 0..self.vs.len() {
let index = self.is[i];
result.push(self.vs[i].get(index).unwrap());
}
*self.is.last_mut().unwrap() += 1;
return Some(result);
}
}
}
fn main() {
let v1: Vec<_> = (1..3).collect();
let v2: Vec<_> = (3..5).collect();
let v3: Vec<_> = (1..6).collect();
let mut i = PermutationIterator::new();
i.add(v1);
i.add(v2);
i.add(v3);
loop {
match i.next() {
Some(v) => {
println!("{:?}", v);
}
None => {
break;
}
}
}
}
error[E0261]: use of undeclared lifetime name `'a`
--> src/main.rs:23:22
|
23 | type Item = Vec<&'a T>;
| ^^ undeclared lifetime
có thể trùng lặp của [Iterator trả về các mục theo tham chiếu, vấn đề suốt đời] (http://stackoverflow.com/questions/24574741/iterator-returning- vấn đề theo từng sự kiện) –
FYI, 'loop {match i.next() {...}}' về cơ bản là những gì 'cho v trong i {}' desugars. – Shepmaster