Я понимаю, что заем не может пережить существование того, на что он указывает, чтобы уничтожить висячие указатели.
Заем или псевдоним могут пережить владельца, подделав время жизни:
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
. Почему это нормально?