Ваш пример выглядит нормально.
Черта Index
способна только «просматривать» уже находящийся в объекте объект и не может использоваться для возврата произвольных динамически генерируемых данных.
В Rust невозможно вернуть ссылку на значение, созданное внутри функции, если это значение не хранится где-то постоянно (ссылки не существуют сами по себе, они всегда заимствуют некоторое значение, принадлежащее где-то).
Ссылка не может быть заимствована из переменной внутри функции, потому что все переменные будут уничтожены до возврата из функции. Время жизни описывает только то, что делает программа, и не может «заставить» что-то жить дольше, чем оно уже делает.
fn index(&self) -> &u32 {
let tmp = 1;
&tmp // not valid, because tmp isn't stored anywhere
}
fn index(&self) -> &u32 {
// ok, because the value is stored in self,
// which existed before this function has been called
&self.tmp
}
Вы можете обнаружить, что возвращение &1
работает. Это потому, что 1
хранится в исполняемом файле вашей программы, который, с точки зрения программы, является постоянным хранилищем. Но 'static
является исключением для литералов и утечек памяти, поэтому в большинстве случаев на это нельзя полагаться.