Почему заимствованный строковый литерал переживает своего владельца, притворяясь на всю жизнь?

Я понимаю, что заем не может пережить существование того, на что он указывает, чтобы искоренить висячие указатели.

Заимствование или псевдоним могут пережить владельца, подделав время жизни:

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

Другие вопросы по тегам