我还是不明白的行为'static
.在以下代码中,say_foo
有效但say_bar
不:
fn say_foo(_: &String) -> &str {
"foo!"
}
fn say_bar(_: &'static String) -> &str {
"bar!"
}
fn main() {
let f = "f".to_string();
let f2 = say_foo(&f); // ok:)
println!("{}", f2);
let b = "b".to_string();
let b2 = say_bar(&b); // error:`b` does not live long enough
println!("{}", b2);
}
Run Code Online (Sandbox Code Playgroud)
即使我传递reference
给两个函数,传递变量的预期寿命在say_foo
和之间也是不同的say_bar
.
在关于生命周期的章节中,我发现这'static
是一个让整个程序中存在生命的信号.
但这'static
似乎并不像那样:b
在b2
(和f
)之前发布.
什么'static
意思?
你犯了一个非常常见的错误,试图决定引用的生命周期,但是生命时间是描述性的,而不是规定性的.
'static
是整个程序持续时间内所有事物的生命周期,例如:
const ID: usize = 4;
fn print(i: &'static usize) { println!("{}", i); }
fn main() {
print(&ID);
}
Run Code Online (Sandbox Code Playgroud)
生命周期ID
是'static
因为我可以传递&ID
给期望a的函数&'static usize
.
如果我有类型的变量usize
中main
:
fn main() {
let i = 4usize;
print(&i);
}
Run Code Online (Sandbox Code Playgroud)
然而,编译器会抱怨说i
活动时间不够长,因为&'static usize
参数类型是一个要求:它表示只接受至少与'static
(可能是最长寿命)一样长的变量.而且i
它的寿命更短,所以它被拒绝了.
重申一下:Rust中的所有东西都有一个内在的生命周期,而'a
符号只是一种观察它而不是修改它的方式.