背景:我正在创建一个返回切片引用的迭代器&[T]
,但数据向量需要保持不可变。迭代器cannot修改原始数据,但修改后必须重复返回相同的切片指针。我考虑过让我的迭代器拥有一个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 的特征实现没有显式的生命周期参数。
如果其中一个别名是可变别名,Rust 会阻止您对一个对象拥有多个别名。
Here, Windower::out_data
是某个切片的可变别名,并且您尝试将不可变别名返回到您的相同数据next
方法。为了确保安全,Rust 必须阻止您使用Windower::out_data
只要返回的切片next
是在范围之内。这意味着签名fn next(&'b mut self) -> Option<Self::Item>
确实是必需的,这意味着您根本无法实现Iterator
与您当前的实施。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)