我怎样才能纠正"无法推断出适当的生命周期"没有编辑功能签名?

时间:2016-02-01 05:55:35

标签: rust

背景:我正在创建一个迭代器,它返回对切片&[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的特征实现没有明确的生命周期参数。

1 个答案:

答案 0 :(得分:1)

如果其中一个是可变别名,

Rust会阻止您拥有多个对象别名。

此处,Windower::out_data是某个切片的可变别名,并且您尝试将不可变别名返回到next方法中的相同数据。为了使其安全,只要Windower::out_data返回的切片在范围内,Rust就必须阻止您使用next。这意味着确实需要签名fn next(&'b mut self) -> Option<Self::Item>,这意味着您无法使用当前的实现来实现Iterator