Implementando a característica do índice para retornar um valor que não é uma referência
Eu tenho uma estrutura simples que eu gostaria de implementarIndex
mas, como recém-chegado ao Rust, estou tendo vários problemas com o verificador de empréstimos. Minha estrutura é bem simples, gostaria de armazenar um valor inicial e de etapa e, em seguida, quando indexado por umusize
deveria retornarstart + idx * step
:
pub struct MyStruct {
pub start: f64,
pub step: f64,
}
Minha intuição é que eu seria simplesmente capaz de assumir a assinatura deIndex
e conecte meus tipos:
impl Index<usize> for MyStruct {
type Output = f64;
fn index(&self, idx: usize) -> &f64 {
self.start + (idx as f64) * self.step
}
}
Isso dá o erromismatched types
dizendoexpected type &f64, found type f64
. Como alguém que ainda não entendeu completamente como funciona o sistema de tipos da Rust, tentei simplesmente dar um tapa&
na expressão:
fn index(&self, idx: usize) -> &f64 {
&(self.start + (idx as f64) * self.step)
}
Isso agora me diz que oborrowed value does not live long enough
, então talvez precise de uma variável vitalícia?
fn index<'a>(&self, idx: usize) -> &'a f64 {
&(self.start + (idx as f64) * self.step)
}
O erro é o mesmo, mas a nota agora fornecelifetime 'a
ao invés delifetime #1
, então acho que isso não é necessário, mas neste momento sinto que estou preso. Estou confuso que um exercício tão simples para a maioria das linguagens tenha se tornado tão difícil de implementar no Rust, pois tudo o que quero fazer é retornar um cálculo a partir de uma função que por trás de uma referência está por trás. Como devo implementarIndex
para uma estrutura simples em que o valor é calculado sob demanda?