Реализация признака индекса для возврата значения, которое не является ссылкой
У меня есть простая структура, которую я хотел бы реализовать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
для простой структуры, где стоимость рассчитывается по требованию?