gpt4 book ai didi

rust - 如何在不编辑函数签名的情况下更正 "cannot infer an appropriate lifetime"?

转载 作者:行者123 更新时间:2023-11-29 08:19:11 25 4
gpt4 key购买 nike

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

最佳答案

如果其中一个是可变别名,Rust 会阻止您对一个对象使用多个别名。

在这里,Windower::out_data是某个切片的可变别名,而您正试图将不可变别名返回给来自 next 的相同数据。方法。为了安全起见,Rust 必须阻止您使用 Windower::out_data。只要 next 返回的切片在范围内。这意味着签名 fn next(&'b mut self) -> Option<Self::Item>确实是必需的,这意味着您根本无法实现 Iterator与您当前的实现。

关于rust - 如何在不编辑函数签名的情况下更正 "cannot infer an appropriate lifetime"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35123824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com