我了解到,借以消除悬空指针不能超过它所指向的事物的存在。
借入或别名可以通过伪造生命周期而使所有者的寿命更长:
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
。为什么可以这样?
答案 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
中找到