Почему нельзя вывести время жизни ссылки как самое короткое из всех контекстных возможностей? - PullRequest
0 голосов
/ 03 августа 2020

Вот пример кода, в котором я тестирую два &str s и возвращаю один из них:

fn bad_longest(s1: &str, s2: &str) -> &str {
  if s1.len() >= s2.len() { s1 } else { s2 }
}

Он не компилировал запрос явного времени жизни, поэтому я предоставил их:

fn longest<'r, 'a, 'b>(s1: &'a str, s2: &'b str) -> &'r str
where
  'a: 'r,
  'b: 'r
{
  if s1.len() >= s2.len() { s1 } else { s2 }
}

Теперь следующий тест проходит без проблем:

static STATIC: &str = "123";

fn main() {
  let auto = "123456";
  let dyn_ = String::from("123456789");
  println!(
    "{}",
    longest(
      longest(STATIC, auto),
      dyn_.as_str()
    )
  );
}

Вот мой вопрос: разве время жизни, которое я указал вручную, не выводятся из контекста? Мне не хватает каких-либо вариантов использования?

1 Ответ

2 голосов
/ 03 августа 2020

Пропущенные времена жизни в сигнатуре функции никогда не выводятся из того, как они используются. Существует несколько простых правил для определения пропущенного времени жизни , которые полностью основаны на самой сигнатуре:

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

В сигнатурах методов есть другое правило

  • Если получатель имеет тип & Self или & mut Self, то время жизни этой ссылки на Self назначается всем исключенным параметрам времени жизни вывода.

Ваша функция имеет два не - self аргументов, поэтому ни одно из этих правил не может указать время жизни для возвращаемого значения, поэтому требуется явное время жизни.

...