将 Peekable 迭代器存储在向量中时无法推断适当的生命周期

2024-01-02

下面的代码可以完美运行:

use std::iter::Peekable;
use std::slice::Iter;

fn has_next(iter: &mut Peekable<Iter<usize>>) -> bool {
    match iter.peek() {
        Some(_) => true,
        None => false,
    }
}

fn print_iters(iters: &mut Vec<Peekable<Iter<usize>>>) {
    for iter in iters.iter_mut() {
        if has_next(iter) {
            match iter.next() {
                Some(x) => println!("{}", x),
                None => {}
            }
        }
    }
}

fn main() {
    let v1 = vec![2, 4, 6, 8];
    let v2 = vec![1, 3, 5, 7];
    let mut iters = Vec::new();
    iters.push((v1.iter().peekable()));
    iters.push((v2.iter().peekable()));
    print_iters(&mut iters);
}

在我编写的一些代码中,我需要存储Peekables 放在向量中并稍后迭代使用它们。我尝试将代码修改为:

use std::iter::Peekable;
use std::slice::Iter;

fn has_next(iter: &mut Peekable<Iter<usize>>) -> bool {
    match iter.peek() {
        Some(_) => true,
        None => false,
    }
}

fn print_iters(iters: &mut Vec<Peekable<Iter<usize>>>) {
    for iter in iters.iter_mut() {
        if has_next(iter) {
            match iter.next() {
                Some(x) => println!("{}", x),
                None => {}
            }
        }
    }
}

fn init_iters(v: &Vec<Vec<usize>>, iters: &mut Vec<Peekable<Iter<usize>>>) {
    for i in v.iter() {
        iters.push(i.iter().peekable());
    }
}

fn main() {
    let v1 = vec![2, 4, 6, 8];
    let v2 = vec![1, 3, 5, 7];
    let v = vec![v1, v2];
    let mut iters = Vec::new();
    init_iters(v, &mut iters);
    print_iters(&mut iters);
}

当我这样做时,我收到以下错误:

error[E0495]: cannot infer an appropriate lifetime for lifetime parameter in function call due to conflicting requirements
  --> src/main.rs:23:20
   |
23 |         for i in v.iter() {
   |                    ^^^^
   |
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the body at 22:79...
  --> src/main.rs:22:80
   |
22 |       fn init_iters(v: &Vec<Vec<usize>>, iters: &mut Vec<Peekable<Iter<usize>>>) {
   |  ________________________________________________________________________________^
23 | |         for i in v.iter() {
24 | |             iters.push(i.iter().peekable());
25 | |         }
26 | |     }
   | |_____^
note: ...so that reference does not outlive borrowed content
  --> src/main.rs:23:18
   |
23 |         for i in v.iter() {
   |                  ^
note: but, the lifetime must be valid for the anonymous lifetime #3 defined on the body at 22:79...
  --> src/main.rs:22:80
   |
22 |       fn init_iters(v: &Vec<Vec<usize>>, iters: &mut Vec<Peekable<Iter<usize>>>) {
   |  ________________________________________________________________________________^
23 | |         for i in v.iter() {
24 | |             iters.push(i.iter().peekable());
25 | |         }
26 | |     }
   | |_____^
note: ...so that expression is assignable (expected std::iter::Peekable<std::slice::Iter<'_, _>>, found std::iter::Peekable<std::slice::Iter<'_, _>>)
  --> src/main.rs:24:24
   |
24 |             iters.push(i.iter().peekable());
   |                        ^^^^^^^^^^^^^^^^^^^

error[E0308]: mismatched types
  --> src/main.rs:33:20
   |
33 |         init_iters(v, &mut iters);
   |                    ^ expected reference, found struct `std::vec::Vec`
   |
   = note: expected type `&std::vec::Vec<std::vec::Vec<usize>>`
              found type `std::vec::Vec<std::vec::Vec<{integer}>>`
   = help: try with `&v`

为什么我会收到此错误?我如何解决它?


根据规则终生省略 https://doc.rust-lang.org/stable/book/second-edition/ch10-03-lifetime-syntax.html#lifetime-elision你的职能init_iters扩展到

fn init_iters<'a, 'b, 'c>(v : &'a Vec<Vec<usize>>,
                          iters : &'b mut Vec<Peekable<Iter<'c, usize>>>) {
    for i in v.iter() {
        iters.push(i.iter().peekable());
    }
}

向量的生命周期'a and Iter的一生'c被宣布为独立。编译器不会尝试推断未明确指定的生命周期界限。该错误告诉您编译器无法证明'c不会超过'a因为他们被宣布为独立。

要修复它,您需要告诉编译器Iter不会比它所引用的向量更长寿。使用生命周期界限'a: 'c可以。

fn init_iters<'a: 'c, 'b, 'c>( ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Peekable 迭代器存储在向量中时无法推断适当的生命周期 的相关文章

随机推荐