Ссылка на локальную строку в 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", сохраните
ссылку и выведите ее. Объясните, почему
здесь локальная строка внутри не создается.