[英]Implementing Index trait to return a value that is not a reference
我有一个简单的结构,我想为其实现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
。 作为尚未完全理解 Rust 的类型系统如何工作的人,我尝试简单地在表达式上加上&
:
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
?
Index
trait 旨在返回一个借用的指向self
成员的指针(例如Vec
一个项目)。 来自Index
trait 的index
方法的签名使得实现它以具有您描述的行为是不切实际的,因为您必须将index
返回的每个值存储在self
并确保指针在MyStruct
被删除之前保持有效。
此用例与Index
的直觉不匹配。 当我看到myStruct[3]
,我的直觉是,就像数组一样,我得到了一个指向一些已初始化数据的指针。 Index
的界面证实了这一直觉。
我可以看到您可能试图实现的两件事:
在这种情况下,我建议反对实现Index
的前提,只提供一种返回f64
而不是&f64
。
impl MyStruct {
pub fn index(&self, idx: usize) -> f64 {
self.start + (idx as f64) * self.step
}
}
你没有得到操作符,这很好,因为有人阅读[]
会被误导,认为他们得到了一个指针。 但是你确实得到了你想要的功能。 根据您的用例,您可能希望重命名此方法。
MyStruct
传递给具有Index
边界的参数。 这是有充分理由的棘手。 Index
期望数据在它要求之前就在那里。 您无法生成并返回它,因为index
返回f64
,并且您无法在数据结构中生成它并返回一个指针,因为它不接受&mut self
。 您必须在调用index
之前填充这些值。 一些重新设计将是有序的,重新设计的方向将取决于您的问题的更大背景。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.