Rust 为什么';t a';静态函数参数使整个程序的某些内容处于活动状态?

Rust 为什么';t a';静态函数参数使整个程序的某些内容处于活动状态?,rust,Rust,我仍然不理解静态的行为。在以下代码中,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:) pri

我仍然不理解静态的行为。在以下代码中,
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);
}
即使我将
reference
传递给这两个函数,传递变量的预期寿命在
say_foo
say_bar
之间也是不同的

在中,我发现,
“static
是一种信号,它使某些东西的生命周期在整个程序中存在

但是这个
静态的
似乎不是这样的:
b
是在
b2
(和
f
)之前发布的


'static
是什么意思?

您犯了一个非常常见的错误,试图规定引用的生存期,但是生存期是描述性的,而不是规定性的


'static
是在整个程序期间存在的所有事物的生命周期,例如:

const ID: usize = 4;

fn print(i: &'static usize) { println!("{}", i); }

fn main() {
    print(&ID);
}
ID
的生存期是
'static
,因此我可以将
&ID
传递给一个需要
&static usize
的函数

如果在
main
中有类型为
usize
的变量:

fn main() {
    let i = 4usize;
    print(&i);
}
然而,编译器会抱怨
i
的寿命不够长,因为
&'static usize
作为参数类型是一项要求:它说只接受寿命至少与
'static
相同的变量(这是最长的可能寿命)。而
i
的生命周期较短,因此被拒绝



重申:锈迹中的所有东西都有一个固有的寿命,
'a
符号只是一种观察锈迹的方法,而不是一种修改锈迹的方法。这两个函数的使用寿命明确,定义如下:

fn say_foo<'a>(_: &'a String) -> &'a str {...}

fn say_bar(_: &'static String) -> &'static str {...}
fn say_foo&'a str{…}
fn说bar(:&'static String)->&'static str{…}
&b
上调用
say_bar
无效,因为
b
没有静态生存期。不能传递比指定的生命周期短的引用。另一方面,调用
say_foo
有效,因为生存期参数
'a
解析为
&b
的生存期