Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsSpLfLc 29 of 288 menu
◀ ▶

Ссылка на локальную строку в Rust

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

Попробуем вернуть общую ссылку на локальную строку:

fn broken() -> &str { let local = String::from("tmp"); &local } fn main() { }

Такой файл не собирается: компилятор сообщает, что local исчезает в конце функции, а тип результата обещает ссылку дольше этого срока. Проверка времени жизни как раз ловит такой разрыв.

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

fn owned() -> String { String::from("ok") } fn echo(text: &str) -> &str { text } fn main() { let saved = owned(); let line = String::from("hi"); let same = echo(line.as_str()); println!("{} {}", saved, same); }

Дан черновик:

fn leak() -> &str { let buf = String::from("data"); &buf }

Скажите, соберется ли программа и какая строка в отчете укажет на срок buf.

Дана функция:

fn make() -> String { String::from("new") }

Вызовите ее из main, сохраните результат в переменную и выведите текст.

Даны параметры:

fn pass(text: &str) -> &str { text }

Передайте литерал "go", сохраните ссылку и выведите ее. Объясните, почему здесь локальная строка внутри не создается.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить