背景:我正在创建一个迭代器,它返回对切片&[T]
的引用,但数据向量需要保持不可变。迭代器不能修改原始数据,但必须在修改后重复返回相同的切片指针。我考虑让我的迭代器拥有一个Vec<T>
,但我想避免这种情况(它似乎没有效果)。我避免分配,因为我计划主要在实时音频中使用它,并且分配可能会阻塞。代码:
pub struct Windower<'a, 'b, T: 'a + 'b> {
window_type: WindowType,
hop_size: usize,
bin_size: usize,
current_index: usize,
data: &'a [T],
out_data: &'b mut [T]
}
impl<'a, 'b, T: Float + FromPrimitive> Iterator for Windower<'a, 'b, T> {
type Item = &'b [T];
fn next(&mut self) -> Option<Self::Item> {
if self.current_index < (self.len() - 1) {
let start = self.current_index * self.hop_size;
let end = start + self.bin_size;
self.current_index += 1;
let window = self.window();
let data_iter = self.data[start..end].iter();
for &mut v in self.out_data {
let val: T = window.next().unwrap() *
*data_iter.next().unwrap();
v = val;
}
Some(self.out_data)
} else {
None
}
}
}
返回错误:
src/waves.rs:160:18: 160:31 error: cannot infer an appropriate lifetime for automatic coercion due to conflicting requirements [E0495]
src/waves.rs:160 Some(self.out_data)
^~~~~~~~~~~~~
src/waves.rs:146:5: 164:6 help: consider using an explicit lifetime parameter as shown: fn next(&'b mut self) -> Option<Self::Item>
我无法弄清楚如何解决这个问题。我无法建议更改,因为Iterator的特征实现没有明确的生命周期参数。
答案 0 :(得分:1)
Rust会阻止您拥有多个对象别名。
此处,Windower::out_data
是某个切片的可变别名,并且您尝试将不可变别名返回到next
方法中的相同数据。为了使其安全,只要Windower::out_data
返回的切片在范围内,Rust就必须阻止您使用next
。这意味着确实需要签名fn next(&'b mut self) -> Option<Self::Item>
,这意味着您无法使用当前的实现来实现Iterator
。