Какие типы Rust обозначаются одним апострофом?

89

Я встречал в Rust несколько типов, обозначенных одним апострофом:

'static
'r
'a

Какое значение имеет этот апостроф? Может это модификатор ссылок ( &)? Универсальная типизация для ссылок? Понятия не имею, где прячется документация по этому поводу.

Грег Малькольм
источник
1
они названы временем жизни: static.rust-lang.org/doc/master/guide-lifetimes.html
Арджан,
Ссылка в предыдущем комментарии больше не работает. Я не знаю, эквивалентно ли это: doc.rust-lang.org/book/lifetimes.html
Эллен Спертус
Ссылка Эллен также перестала работать - вот новая (по состоянию на июнь 2019 г.): doc.rust-lang.org/book/ch10-03-lifetime-syntax.html

Ответы:

71

Это названные времена жизни Rust.

Цитата из языка программирования Rust :

Каждая ссылка в Rust имеет время жизни, которое является областью действия, для которой эта ссылка действительна. Большую часть времени жизни неявны и предполагаются, как и большинство типов времени. Подобно тому, как мы должны аннотировать типы, потому что возможно несколько типов, бывают случаи, когда время жизни ссылок может быть связано несколькими разными способами, поэтому Rust требует, чтобы мы аннотировали отношения, используя общие параметры времени жизни, чтобы убедиться, что фактические ссылки, используемые во время выполнения, безусловно, будут действительными.

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

Аннотации времени жизни имеют немного необычный синтаксис: имена параметров времени жизни должны начинаться с апострофа '. Имена параметров времени жизни обычно все в нижнем регистре, и, как и общие типы, их имена обычно очень короткие. 'aэто имя, которое большинство людей используют по умолчанию. Аннотации параметров времени жизни идут после &ссылки, а примечание времени жизни отделяется от типа ссылки пробелом.

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

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

Вы можете получить больше информации из этой колоды слайдов , начиная со слайда 29.

Время жизни в Rust также рассматривает время жизни более подробно.

quux00
источник