Опускание времени жизни
Для того, чтобы распространённый код было удобнее писать, 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> // указано явно