关于 Rust 静态生命周期和范围的问题

Question about Rust Static Lifetime and scope

我最近在学习 Rust,但是停在 lifetime.anyone 可以帮助我吗? 我正在尝试制作一个具有静态生命周期的字符串文字,但是当它超出范围时,参考 不能再使用了。

fn main(){
 {
  let s: &'static str = "hello world";
 }
  println("s={}",s);
}

我收到一个错误:在此范围内找不到 我正在尝试使用静态关键字

fn main(){
 {
  static s: &'static str = "hello world";
 }
  println("s={}",s);
}

还是一样。 静态关键字、静态生命周期和范围之间有什么区别? 谢谢!

作用域与生命周期不同。在大多数情况下,它们是相似的:

fn main() {
    { // scope starts here with '{'
        let foo = Foo::new(); // create a new variable inside scope
    } // scope ends here. Every owned value inside scope is deallocated.
    // foo is inaccessible here
}

即使变量的生命周期大于封闭范围,也不意味着您可以在范围外访问它。相反,生命周期只是告诉您某个变量的有效期。

考虑这一点的一种方式是拥有所有变量。甚至参考。您可以想象持有某个引用的变量正在拥有该引用(而不是实际值本身)。当保存引用的变量超出范围时,“拥有的”引用也会被删除,但不会删除实际值。

在您的示例中,s 拥有对 str 的引用。当 s 超出范围时,引用将被删除,但不会删除它指向的实际 str 本身(它是 'static 因此在程序终止之前它不会被删除)。

由于引用已删除,您无法再访问它。

如您的示例所示,只需将 s 的声明放在与您使用它的位置相同或更大的范围内。由于 str'static 并且是常量,您可以创建一个全局变量:

static s: &str = "Hello World!"; // note that 'static is implicit