Implementación del rasgo de índice para devolver un valor que no es una referencia
Tengo una estructura simple que me gustaría implementarIndex
para, pero como recién llegado a Rust, estoy teniendo varios problemas con el verificador de préstamos. Mi estructura es bastante simple, me gustaría que almacene un valor de inicio y de paso, luego, cuando lo indexe unusize
debería volverstart + idx * step
:
pub struct MyStruct {
pub start: f64,
pub step: f64,
}
Mi intuición es que simplemente podría tomar la firma deIndex
y conecte mis tipos:
impl Index<usize> for MyStruct {
type Output = f64;
fn index(&self, idx: usize) -> &f64 {
self.start + (idx as f64) * self.step
}
}
Esto da el errormismatched types
diciendoexpected type &f64, found type f64
. Como alguien que aún no ha entendido completamente cómo funciona el sistema de tipos de Rust, intenté simplemente abofetear&
en la expresión:
fn index(&self, idx: usize) -> &f64 {
&(self.start + (idx as f64) * self.step)
}
Esto ahora me dice que elborrowed value does not live long enough
Entonces, ¿tal vez necesita una variable de por vida?
fn index<'a>(&self, idx: usize) -> &'a f64 {
&(self.start + (idx as f64) * self.step)
}
El error es el mismo, pero la nota ahora dalifetime 'a
en lugar delifetime #1
, así que supongo que no es necesario, pero en este punto siento que estoy atascado. Estoy confundido de que un ejercicio tan simple para la mayoría de los idiomas se haya vuelto tan difícil de implementar en Rust, ya que todo lo que quiero hacer es devolver un cálculo de una función que está detrás de una referencia. ¿Cómo debo hacer para implementarIndex
para una estructura simple donde el valor se calcula bajo demanda?