Как Rust безопасно использует ссылку с более долгим временем жизни там, где требуется более короткое?
Rust может укоротить время жизни ссылки, если исходная ссылка гарантированно действительна как минимум весь требуемый короткий период. Это безопасно: получатель видит только ограниченный промежуток допустимого использования ссылки. Обратное преобразование — продление времени жизни — невозможно, поскольку могло бы создать ссылку на уже освобождённое значение.
Владение и времена жизни позволяют Rust обеспечивать безопасность памяти без сборщика мусора и без ручного управления временем освобождения объектов. Для этого компилятору нужно не только знать, кто владеет значением, но и проверять, что каждая ссылка используется лишь пока её объект существует.
Укорачивание времени жизни — часть этой модели: один и тот же объект можно безопасно предоставить функции или блоку кода на меньший срок, не создавая копию и не передавая владение.
Предположим, ссылка действительна до конца внешней области видимости, а вызываемой функции она нужна только до конца одного вызова. Требовать отдельного значения или копирования было бы избыточно, но передавать ссылку с неограниченным сроком тоже нельзя: функция не должна получить возможность сохранить её дольше разрешённого периода.
Ошибочное продление времени жизни создало бы висячую ссылку. Например, ссылка на локальное значение не может пережить владельца, даже если какой-либо контекст формально ожидает ссылку с более долгим временем жизни.
Если время жизни 'long включает время жизни 'short, это записывают отношением 'long: 'short. Неизменяемую ссылку &'long T можно использовать там, где требуется &'short T, потому что все операции чтения в коротком интервале остаются безопасными.
Вызов не перемещает строку и не продлевает её существование. Компилятор лишь рассматривает исходную ссылку как ссылку с более коротким сроком, потому что text гарантированно живёт не меньше этого срока.
Это свойство называют ковариантностью по времени жизни. Для неизменяемых ссылок оно естественно: получатель может читать значение, но не может использовать ссылку для записи или сохранить её произвольно дольше объявленного срока.
Нельзя выполнить обратное преобразование — из &'short T в &'long T. Короткая ссылка может указывать на локальный объект или временное значение, поэтому после окончания 'short её использование было бы потенциально небезопасным.
У изменяемой ссылки время жизни также может быть укорочено, но это не отменяет правила уникальности. Во время активного повторного заимствования исходная &mut T недоступна, а тип T внутри &mut T рассматривается инвариантно: иначе через изменяемую ссылку можно было бы записать значение неподходящего типа.
В библиотечной функции обработчик получает ссылку на большой буфер только на время вызова. Владелец буфера живёт дольше, поэтому передача &buffer без копирования является безопасной и эффективной: функция получает ограниченное заимствование, а после возврата владелец снова может использовать буфер.
Рассматривались два варианта. Клонирование буфера упрощает некоторые сигнатуры, но увеличивает потребление памяти и время работы. Передача владения делает функцию ответственнее за объект и лишает вызывающий код возможности пользоваться им до возврата.
Выбран короткий срок заимствования. Он сохраняет владение у вызывающего кода, исключает копирование и не позволяет обработчику сохранить ссылку за пределами разрешённого вызова. Результатом становится безопасный интерфейс с минимальной стоимостью.
Да. Укорачивается не существование объекта, а период, в течение которого конкретную ссылку разрешено использовать. Объект продолжает жить по правилам своего владельца, а ссылка получает более строгий, короткий контракт.
Потому что короткая ссылка не содержит гарантии существования объекта после окончания своего срока. Продление только типа ссылки не продлевает владельца: компилятор не может сделать локальное значение живущим дольше области видимости. Поэтому преобразование к более долгому времени жизни было бы потенциальным созданием висячей ссылки.
Нет. Для &T после завершения операции чтения это обычно возможно, если ссылка больше не используется. Для &mut T действует дополнительное правило: пока существует активное повторное заимствование, исходная изменяемая ссылка временно недоступна. Укорачивание времени жизни ограничивает срок ссылки, но само по себе не отменяет правил эксклюзивного доступа.