繁体   English   中英

实现索引特征以返回一个不是引用的值

[英]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的界面证实了这一直觉。

我可以看到您可能试图实现的两件事:

  1. 为您的数据结构获取良好的索引语法。

在这种情况下,我建议反对实现Index的前提,只提供一种返回f64而不是&f64

impl MyStruct {
    pub fn index(&self, idx: usize) -> f64 {
        self.start + (idx as f64) * self.step
    }
}

你没有得到操作符,这很好,因为有人阅读[]会被误导,认为他们得到了一个指针。 但是你确实得到了你想要的功能。 根据您的用例,您可能希望重命名此方法。

  1. MyStruct传递给具有Index边界的参数。

这是有充分理由的棘手。 Index期望数据在它要求之前就在那里。 您无法生成并返回它,因为index返回f64 ,并且您无法在数据结构中生成它并返回一个指针,因为它不接受&mut self 您必须在调用index之前填充这些值。 一些重新设计将是有序的,重新设计的方向将取决于您的问题的更大背景。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM