为什么借来的字符串文字可以伪造一辈子而超过其所有者?

时间:2019-01-09 17:28:18

标签: rust lifetime borrow-checker borrowing

我了解到,借以消除悬空指针不能超过它所指向的事物的存在。

借入或别名可以通过伪造生命周期而使所有者的寿命更长:

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变量长,显然firstsecond变量的生存期是不同的。

e初始化longest(first, second)时,它会得到second变量,该变量的函数调用生命周期被伪造,因为它等于first,但仅限于块并将其分配给e。为什么可以这样?

1 个答案:

答案 0 :(得分:8)

这是因为它们两者都具有'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

中找到