我有一个简单的结构,我想实现Index
,但作为Rust的新手,我在借用检查程序时遇到了一些麻烦。我的结构很简单,我想有它存储开始和步长值,则当由usize
索引,它应该返回start + idx * step
:实现索引特征以返回非参考值
pub struct MyStruct {
pub start: f64,
pub step: f64,
}
我的直觉是,我只是能采取的Index
签名和插在我的类型:
impl Index<usize> for MyStruct {
type Output = f64;
fn index(&self, idx: usize) -> &f64 {
self.start + (idx as f64) * self.step
}
}
这给了错误mismatched types
说expected type &f64, found type f64
。正如有人谁尚未完全了解锈病的类型系统是如何工作的,我试着拍打只是在表达&
:
fn index(&self, idx: usize) -> &f64 {
&(self.start + (idx as f64) * self.step)
}
现在,这告诉我,borrowed value does not live long enough
,所以也许需要一辈子的变量?
fn index<'a>(&self, idx: usize) -> &'a f64 {
&(self.start + (idx as f64) * self.step)
}
的错误是一样的,但记现在给lifetime 'a
,而不是lifetime #1
,所以我想这是没有必要的,但在这一点上我觉得我卡住了。我很困惑,对于大多数语言来说这样一个简单的练习已经变得非常难以在Rust中实现,因为我想要做的就是从恰好在参考之后的函数返回一个计算。我应该如何执行Index
以获得按需计算价值的简单结构?
那么在MyStruct上实现一个名为'index'或'at'的方法只需要一个'usize'并返回一个'f64'?我还想实现使用Python片段(我认为是生锈的''Range)进行索引的能力,使用'...'语法作为函数参数可能吗? – bheklilr
您可以编写一个独立的'index'方法,但是您将无法将它与索引语法('x [i]')结合使用。范围语法产生具有由标准库提供的类型的值(例如'x..y'产生['Range'](https://doc.rust-lang.org/stable/std/ops/struct.Range.html )值)。 –
所以基本上我只是在这里运气不好?哦,这不是什么大不了的事,只是一种学习新语言的不同范式。 – bheklilr