- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下代码完美运行:
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);
}
在我编写的一些代码中,我需要将 Peekable
存储在一个向量中,并在以后迭代使用它们。我尝试将代码修改为:
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`
为什么会出现此错误?我该如何解决?
最佳答案
根据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
和 Iter
的生命周期 'c
被声明为独立的。编译器不会尝试推断未明确指定的生命周期范围。该错误告诉您编译器无法证明 'c
不会比 'a
长寿,因为它们被声明为独立的。
要修复它,您需要告诉编译器 Iter
不会比它所引用的向量长寿。使用生命周期绑定(bind) 'a: 'c
做到这一点。
fn init_iters<'a: 'c, 'b, 'c>( ...
关于iterator - 在向量中存储 Peekable 迭代器时无法推断出适当的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45003170/
我正在尝试使用 Rust 版本 1.22.1 编译以下代码: use std::str::Split; use std::iter::Peekable; // This is fine... fn t
use std::iter::Peekable; pub trait AdvanceWhile { fn advance_while(&mut self, predicate: P)
use std::iter::Peekable; pub trait AdvanceWhile { fn advance_while(&mut self, predicate: P)
以下代码完美运行: use std::iter::Peekable; use std::slice::Iter; fn has_next(iter: &mut Peekable>) -> bool {
use std::str::Chars; trait Extractor { fn peek_first(&mut self) -> Option; } impl Extractor for
我想实现一个在字符串开头跳过 ! 或 !^num 的算法: fn extract_common_part(a: &str) -> Option { let mut it = a.chars()
我只需要找到下一个数字相同的数字:[1,2,2,3,4,4] 应该生成 [2,4]。因为我需要查看下一个数字,所以我想我会尝试使用 Peekable iterator并编写一个过滤器。 fn main
我对在字符流中向前看很感兴趣。据我了解,Peekable将是要走的路。我完全不知道如何使用它。 第一次尝试: fn trawl(pk: &mut I) where I: std::iter::Peek
长见识 如何编译下面的代码? let mut iter = (1..3).peekable(); let h = iter.peek(); iter.next(); 更新:我阅读了How to use
我有一个类型为 &mut Peekable 的值我想将它用作其他函数的输入值,该函数获取类型为 &[u8] 的值.我怎样才能改变它的类型? 最佳答案 Peekable是一个迭代器,它从它包装的迭代器中
我想使用 Peekable作为新cautious_take_while的基础类似于take_while 的操作来自 IteratorExt但不消耗第一个失败的项目。 (有一个附带的问题,即这是否是一个
我是一名优秀的程序员,十分优秀!