Implementing Index Trait, um einen Wert zurückzugeben, der keine Referenz ist

Ich habe eine einfache Struktur, die ich implementieren möchteIndex für, aber als Neuling in Rust habe ich einige Probleme mit dem Leihschein. Meine Struktur ist ziemlich einfach, ich möchte, dass sie einen Start- und einen Schrittwert speichert, wenn sie dann durch ein @ indiziert wirusize sollte es zurückgebenstart + idx * step:

pub struct MyStruct {
    pub start: f64,
    pub step: f64,
}

Meine Intuition ist, dass ich einfach die Signatur von @ nehmen kaIndex und meine Typen einstecken:

impl Index<usize> for MyStruct {
    type Output = f64;

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

Dies gibt den Fehlermismatched types Sprichwortexpected type &f64, found type f64. Als jemand, der noch nicht vollständig verstanden hat, wie Rusts Typensystem funktioniert, habe ich versucht, einfach auf @ zu schlage& auf den Ausdruck:

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

Dies sagt mir jetzt, dass dieborrowed value does not live long enough, also braucht es vielleicht eine lebenslange Variable?

fn index<'a>(&self, idx: usize) -> &'a f64 {
    &(self.start + (idx as f64) * self.step)
}

Der Fehler ist der gleiche, aber der Hinweis gibt jetztlifetime 'a Anstatt vonlifetime #1, also denke ich, dass das nicht notwendig ist, aber an diesem Punkt fühle ich mich wie ich festgefahren bin. Ich bin verwirrt, dass eine so einfache Übung für die meisten Sprachen in Rust so schwer zu implementieren ist, da ich nur eine Berechnung von einer Funktion zurückgeben möchte, die sich zufällig hinter einer Referenz befindet. Wie soll ich bei der Implementierung von @ vorgeheIndex für eine einfache Struktur, bei der der Wert nach Bedarf berechnet wird?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage