Почему заимствованный строковый литерал переживает своего владельца, притворяясь на всю жизнь?
Я понимаю, что заем не может пережить существование того, на что он указывает, чтобы искоренить висячие указатели.
Заимствование или псевдоним могут пережить владельца, подделав время жизни:
fn main() {
let e;
let first = "abcd";
{
let second = "defgh";
e = longest(first, second);
}
println!("{}", e);
}
fn longest<'a>(first: &'a str, second: &'a str) -> &'a str {
if first.len() > second.len() {
first
} else {
second
}
}
Результат:
defgh
В приведенном выше примере переменная e
имеет более длительный срок службы, чем second
переменный и явно first
& second
Время жизни переменных различно.
когда e
инициализируется с longest(first, second)
это получает second
переменная, время жизни которой до вызова функции является фиктивным, так как оно равно first
но он ограничен блоком и назначен e
который переживет second
, Почему это нормально?
1 ответ
Это связано с тем, что оба из них имеют 'static
продолжительность жизни.
Вот пример, который не работает, потому что str
здесь не для жизни живет программа вроде &'static str
делает. Единственное изменение - следующая строка: let second = String::from("defgh");
и следующая строка, где она передается самой длинной функции.
fn main() {
let e;
let first = "abcd";
{
let second = String::from("defgh");
e = longest(first, &second);
}
println!("{}", e);
}
fn longest<'a>(first: &'a str, second: &'a str) -> &'a str {
if first.len() > second.len() {
first
} else {
second
}
}
Вот ошибка:
error[E0597]: `second` does not live long enough
--> src/main.rs:6:28
|
6 | e = longest(first, &second);
| ^^^^^^^ borrowed value does not live long enough
7 | }
| - `second` dropped here while still borrowed
8 | println!("{}", e);
| - borrow later used here
Больше информации можно найти в Static - Rust By Example