我天真地尝试做了这件事:
struct Foo<'a, S: Send, T:Send> {
next_:Box<Fn<(&'a mut S,), Option<T>> + Send>,
state:S
}
impl<'a, S: Send, T: Send> Iterator<T> for Foo<'a, S, T> {
fn next(&mut self) -> Option<T> {
return self.next_.call((&mut self.state,));
}
}
为了创建一个迭代器,我可以使用闭包轻松地将其发送到任务中。但是,这会生成可怕的生命周期不匹配错误:
<anon>:8:33: 8:48 error: cannot infer an appropriate lifetime for borrow expression due to conflicting requirements
<anon>:8 return self.next_.call((&mut self.state,));
^~~~~~~~~~~~~~~
<anon>:7:5: 9:6 help: consider using an explicit lifetime parameter as shown: fn next(&'a mut self) -> Option<T>
<anon>:7 fn next(&mut self) -> Option<T> {
<anon>:8 return self.next_.call((&mut self.state,));
<anon>:9 }
error: aborting due to previous error
playpen: application terminated with error code 101
我不理解这个错误。
闭包应该带有一个生命周期为'a的参数,这是结构体的生命周期。
状态由结构体拥有,因此它具有'a的生命周期。
使用next_.call((&mut self.state,))不会调用任务;它只应在调用()期间存在,据我所知,这应该是有效的。
因此,在next()中self的生命周期和call中的'a之间存在不匹配...但我不明白为什么它不是'a。
如何正确修复上面的代码?
是否有更好的方法来完成这个任务?
playpen: http://is.gd/hyNi0S