实现索引特征以返回一个不是引用的值 [英] Implementing Index trait to return a value that is not a reference
问题描述
我有一个简单的结构,我想为其实现 Index
,但是作为 Rust 的新手,我在借用检查器方面遇到了许多麻烦.我的结构非常简单,我想让它存储一个开始和步长值,然后当由 usize
索引时它应该返回 start + idx * step
:
I have a simple struct that I would like to implement Index
for, but as a newcomer to Rust I'm having a number of troubles with the borrow checker. My struct is pretty simple, I'd like to have it store a start and step value, then when indexed by a usize
it should return start + idx * step
:
pub struct MyStruct {
pub start: f64,
pub step: f64,
}
我的直觉是我可以简单地获取 Index
的签名并插入我的类型:
My intuition is that I'd simply be able to take the signature of Index
and plug in my types:
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
.作为尚未完全理解 Rust 的类型系统如何工作的人,我尝试简单地在表达式上加上 &
:
This gives the error mismatched types
saying expected type &f64, found type f64
. As someone who has yet to fully understand how Rust's type system works, I tried simply slapping &
on the expression:
fn index(&self, idx: usize) -> &f64 {
&(self.start + (idx as f64) * self.step)
}
现在告诉我借来的值存活时间不够长
,所以它可能需要一个生命周期变量?
This now tells me that the borrowed value does not live long enough
, so maybe it needs a lifetime variable?
fn index<'a>(&self, idx: usize) -> &'a f64 {
&(self.start + (idx as f64) * self.step)
}
错误是一样的,但是注释现在给出了 lifetime 'a
而不是 lifetime #1
,所以我想这没有必要,但在这一点上我觉得就像我被卡住了一样.我很困惑,对于大多数语言来说,这样一个简单的练习在 Rust 中变得如此困难,因为我想要做的就是从恰好位于引用后面的函数返回一个计算.对于按需计算值的简单结构,我应该如何实施 Index
?
The error is the same, but the note now gives lifetime 'a
instead of lifetime #1
, so I guess that's not necessary, but at this point I feel like I'm stuck. I'm confused that such a simple exercise for most languages has become so difficult to implement in Rust, since all I want to do is return a computation from a function that happens to be behind a reference. How should I go about implementing Index
for a simple structure where the value is calculated on demand?
推荐答案
Index
trait 旨在返回一个借用的指针,指向 self
的成员(例如一个项目在 Vec
中).Index
trait 中的 index
方法的签名使得实现它以具有您描述的行为是不切实际的,因为您必须存储 self
中的 >index 并确保指针保持有效,直到 MyStruct
被删除.
The Index
trait is meant to return a borrowed pointer to a member of self
(e.g. an item in a Vec
). The signature of the index
method from the Index
trait makes it impractical to implement it to have the behavior you described, as you'd have to store every value returned by index
in self
and ensure that the pointers remain valid until the MyStruct
is dropped.
这篇关于实现索引特征以返回一个不是引用的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!