Понимание этого примера времени жизни Rust

Я новичок в Rust и все еще борюсь с жизнями в Rust. Ниже приведен пример из книги, которую я читаю. Может ли кто-нибудь помочь объяснить, почему автор может получить эту информацию, просто взглянув на подпись функции? У меня уже есть базовые представления о заимствовании, ссылках и т. Д., Но я все еще не могу этого понять.

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

fn parse_record<'i>(input: &'i [u8]) -> Record<'i> { ... }

Не обращая внимания на определение типа записи, мы можем сказать, что если мы получаем запись от parse_record, любые ссылки, которые она содержит, должны указывать на входной буфер, который мы передали, и нигде больше (кроме, возможно, статических значений) .


person Just a learner    schedule 21.12.2019    source источник
comment
Я не уверен, поэтому я комментирую, но эта информация, вероятно, может быть получена из явного времени жизни 'i. Поскольку Rust запрещает возвращать ссылку на локальную переменную И Record имеет то же время жизни, что и input, это должно означать, что все, что находится в Record, должно происходить из input.   -  person GrayCat    schedule 21.12.2019
comment
Думайте о жизни как о масштабе; значение с указанным временем жизни будет отброшено в конце области. Следовательно, если мы говорим, что Record должен существовать до тех пор, пока значение в области видимости, которую мы называем 'i, мы получим Record<'i>.   -  person Optimistic Peach    schedule 21.12.2019


Ответы (2)


Record может получать ссылки только из тела функции. Теоретически они могут исходить от

  • значения в input, которые все ссылки с временем жизни 'i
  • значения, определенные за пределами parse_record, которые должны иметь 'static время жизни
  • values defined in parse_record. These can be
    • dynamically created. Such values would be dropped by the end of the function scope, so any references to them would end up as dangling pointers. As such, this isn't allowed by the compiler.
    • литералы (1, "cat"). Они фактически встроены в двоичный файл и поэтому фактически определяются вне функции. В функции они 'static ссылки
person joel    schedule 21.12.2019

Вход:

input: &'i [u8]

Говорит следующее:

Я имею в виду серию байтов ([u8]), которые будут жить по крайней мере столько же, сколько 'i.

Итак, говоря, что у меня есть тип, который выглядит так: Record<'i>, я могу сказать о нем следующее:

Я - структура (названная Record<'i>), которая содержит что-то (возможно, ссылку, возможно, что-то еще), что зависит от чего-то, живущего по крайней мере столько же, сколько 'i.

Время жизни ссылок / структур / перечислений / всего, что вам говорит, - это то, что существует зависимость, согласно которой объект, который живет в 'i, должен жить так же долго, как и я.

Другими словами, эта сигнатура функции сообщает вам, что Record должен существовать до тех пор, пока байты, на которые ссылается input (u8s под ссылкой, а не сама ссылка).


Отсутствие параметра времени жизни недавно устарело и теперь вызывает предупреждение, поэтому имейте в виду, читая такие примеры, как следующие:

fn parse_record(input: &[u8]) -> Record

что может быть привязанным к Record сроком жизни, поэтому вы должны обратиться к какой-то документации. Компиляция обессахаривает это (и предупреждение просит вас сделать это самостоятельно) до следующего:

fn parse_record(input: &'_ [u8]) -> Record<'_>

Это идентично вашему 'i примеру.

person Optimistic Peach    schedule 21.12.2019