Опускание времени жизни

Для того, чтобы распространённый код было удобнее писать, Rust позволяет опускать время жизни в сигнатурах функций.

Положение времени жизни находится в:

&'a T
&'a mut T
T<'a>

Время жизни может появляться как "на входе", так и "на выходе":

  • В описании fn на входе время жизни применяется к аргументам fn, в то время как на выходе - к возвращаемому результату. Поэтому в fn foo(s: &str) -> (&str, &str) опускается одно время жизни на входе и два на выходе. Помните, что в описании метода на входе не опускается время жизни из заголовка impl этого метода (также не опускаются времена жизни из заголовка типажа, для метода по умолчанию).

  • В будущем, можно будет опускать время жизни также в заголовках impl.

Правила опускания:

  • Каждое опущенное время жизни на входе становится отдельным параметром.

  • Если есть только одно время жизни на входе (опущенное или нет), это время жизни присваивается всем опущенным временам жизни на выходе.

  • Если есть несколько времён жизни на входе, но одно из них &self или &mut self, время жизни self присваивается всем опущенным временам жизни на выходе.

  • Все другие случаи считаются ошибочными, если время жизни на выходе опущено.

Примеры:

fn print(s: &str);                                      // опущено
fn print<'a>(s: &'a str);                               // указано явно

fn debug(lvl: uint, s: &str);                           // опущено
fn debug<'a>(lvl: uint, s: &'a str);                    // указано явно

fn substr(s: &str, until: uint) -> &str;                // опущено
fn substr<'a>(s: &'a str, until: uint) -> &'a str;      // указано явно

fn get_str() -> &str;                                   // НЕПРАВИЛЬНО

fn frob(s: &str, t: &str) -> &str;                      // НЕПРАВИЛЬНО

fn get_mut(&mut self) -> &mut T;                        // опущено
fn get_mut<'a>(&'a mut self) -> &'a mut T;              // указано явно

fn args<T: ToCStr>(&mut self, args: &[T]) -> &mut Command                  // опущено
fn args<'a, 'b, T: ToCStr>(&'a mut self, args: &'b [T]) -> &'a mut Command // указано явно

fn new(buf: &mut [u8]) -> BufWriter;                    // опущено
fn new<'a>(buf: &'a mut [u8]) -> BufWriter<'a>          // указано явно