Разбирался со временами жизни указателей, в итоге понял написав такой код:
// Наша функция принимает 2 параметра-ссылки типа int32
// и возвращает кортеж из этих значений, причём первое значение будет увеличено на 1
fn foo<'a, 'b>(i: &'a mut i32, j: &'b i32) -> (&'a i32, &'b i32) {
*i += 1;
(i, j)
}
fn main() {
let mut x1 = 5;
let res;
{
// Сохраняем в res значение .0
res = foo(&mut x1, &mut 3).0;
}
// Всё ок, 6, т.к. время жизни первого параметра foo совпадает с x1,
// а вот элемент .1 мы бы не смогли сохранить, т.к. его время жизни другое
// и он удалится из памяти при выходе из блока 20-23
println!("{}", res);
}
Думаю, будет полезно изучающим Rust.