为什么'静态函数参数不会为整个程序生成一些东西?

hon*_*ono 2 rust

我还是不明白的行为'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似乎并不像那样:bb2(和f)之前发布.

什么'static意思?

Mat*_* M. 6

你犯了一个非常常见的错误,试图决定引用的生命周期,但是生命时间是描述性的,而不是规定性的.


'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.

如果我有类型的变量usizemain:

fn main() {
    let i = 4usize;
    print(&i);
}
Run Code Online (Sandbox Code Playgroud)

然而,编译器会抱怨说i活动时间不够长,因为&'static usize参数类型是一个要求:它表示只接受至少与'static(可能是最长寿命)一样长的变量.而且i它的寿命更短,所以它被拒绝了.


重申一下:Rust中的所有东西都有一个内在的生命周期,而'a符号只是一种观察它而不是修改它的方式.