【发布时间】:2021-06-22 23:42:13
【问题描述】:
我正在编写一些我想使用迭代器的代码,或者它的反转版本取决于一个标志,但是简单的代码给出了一个错误
pub fn eggs<I,T>(iter:I)->Box<dyn Iterator<Item=T>>
where I:Iterator<Item=T>+DoubleEndedIterator
{
Box::new(iter.rev())
}
pub fn bacon<I,T>(iter:I, reverse:bool) -> Box<dyn Iterator<Item=T>>
where I:Iterator<Item=T>+DoubleEndedIterator
{
if reverse {
Box::new(iter.rev())
} else {
Box::new(iter)
}
}
fn main()
{
let pants:String = "pants".into();
eggs(pants.chars());
}
编译失败:
error[E0310]: the parameter type `I` may not live long enough
--> src/main.rs:5:5
|
2 | pub fn eggs<I,T>(iter:I)->Box<dyn Iterator<Item=T>>
| - help: consider adding an explicit lifetime bound...: `I: 'static`
...
5 | Box::new(iter.rev())
| ^^^^^^^^^^^^^^^^^^^^ ...so that the type `Rev<I>` will meet its required lifetime bounds
由于我对 Rust 的了解有限,我不确定这些生命周期界限的来源。 Iterator trait 或 Rev 结构上没有任何参数,并且正在移动参数。
鉴于'static 并不是一个真正的选择,声明这些函数的正确方法是什么。
【问题讨论】:
-
您可能还想查看 either 板条箱而不是装箱。
标签: rust