我有一个想要实现的简单结构Index,但作为 Rust 的新手,我在借用检查器方面遇到了许多麻烦。我的结构非常简单,我想让它存储一个开始和步长值,然后当被 a 索引时usize它应该返回start + idx * step:
pub struct MyStruct {
pub start: f64,
pub step: f64,
}
Run Code Online (Sandbox Code Playgroud)
我的直觉是,我可以简单地获取签名Index并插入我的类型:
impl Index<usize> for MyStruct {
type Output = f64;
fn index(&self, idx: usize) -> &f64 {
self.start + (idx as f64) * self.step
}
}
Run Code Online (Sandbox Code Playgroud)
这给出了错误mismatched types说expected type &f64, found type f64。作为还没有完全理解 Rust 的类型系统如何工作的人,我尝试简单地&对表达式进行处理:
fn index(&self, idx: usize) -> &f64 {
&(self.start + (idx as f64) * self.step)
}
Run Code Online (Sandbox Code Playgroud)
这现在告诉我borrowed value does not live long enough, 所以也许它需要一个生命周期变量?
fn index<'a>(&self, idx: usize) -> &'a f64 {
&(self.start + (idx as f64) * self.step)
}
Run Code Online (Sandbox Code Playgroud)
错误是一样的,但是注释现在给出了lifetime 'a而不是lifetime #1,所以我想这没有必要,但在这一点上我觉得我被卡住了。我很困惑,对于大多数语言来说,这样一个简单的练习在 Rust 中变得如此难以实现,因为我想要做的就是从恰好位于引用后面的函数返回一个计算。我应该如何实施Index一个按需计算值的简单结构?
该Index特征旨在返回指向成员的借用指针self(例如 a 中的项目Vec)。index特征中方法的签名Index使得实现它以具有您所描述的行为是不切实际的,因为您必须存储 in 返回的每个值index并self确保指针保持有效,直到被MyStruct删除。