【发布时间】:2014-09-03 22:36:25
【问题描述】:
我发现 Rust 破坏了一些旧代码,我决心修复它。可悲的是,生命周期引用似乎发生了很大变化,并且正在发生一些奇怪的事情。
字段Counter.data 无关紧要,它只是用来表明我使用了一些数据并且它引用了通用的东西。
代码如下:
struct Counter <'c, T: 'c> {
val: u32,
data: &'c T
}
struct CounterIterator<'c, T:'c> {
iter: &'c mut Counter<'c, T>,
num: u32
}
impl<'r, T> Iterator<u32> for CounterIterator<'r, T> {
fn next(&mut self) -> Option<u32> {
if self.num == 0 {
None
} else {
self.num -= 1;
self.iter.incr()
}
}
}
impl<'c, T> Counter <'c, T> {
fn new(dataz: &'c T) -> Counter<'c, T> {
Counter {
val: 0u32,
data: dataz
}
}
fn incr(&mut self) -> Option<u32> {
self.val += 1;
println!("{}", self.val);
Some(self.val)
}
fn iter(&'c mut self, num: u32) -> CounterIterator<'c, T> {
CounterIterator {
iter: self,
num: num
}
}
}
fn main() {
let val = 11u;
let mut cnt = Counter::new(&val);
for i in range(0,2u) {
cnt.incr();
}
for i in cnt.iter(3) {
}
cnt.incr(); // <- commenting this out "fixes" the problem
// Otherwise the error is
// note: previous borrow of `cnt` occurs here; the mutable borrow prevents
// subsequent moves, borrows, or modification of `cnt` until the borrow ends
}
这里有什么错误?
我该如何做到这一点,以便“迭代器”习语在它退出循环时结束借用,而不是在它定义的块结束时结束?
另外,显式生命周期T:'c 是做什么的?
作为记录,我正在尝试实现类似于 str.chars() 的迭代器 API。如果有更明智的方法,请告诉我。
【问题讨论】: