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

标签 rust static lifetime

我最近在研究Rust,但是终其一生。有人可以帮助我吗?
我正在尝试使用静态生存期创建字符串文字,但是当它超出范围时,该引用
不能再使用了。

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

关于rust - 关于Rust静态生命周期和范围的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65622779/

相关文章:

rust - 不可变值仍在移动

sockets - Rust 中 TcpListener 和 TcpAcceptor 的职责

c# - 单个 C# 类中的静态成员初始化顺序

java - 如何在不使用类名的情况下在静态方法中获取 Class 对象?

rust - 为什么不能在同一结构中存储值和对该值的引用?

rust - 我可以在运行时选择特征对象而不使用 Box<Trait> 吗?

data-structures - 如何在安全的Rust中遍历相互递归的图?

generics - 如何重写这个通用参数?

java - 无法对非静态方法库进行静态引用

compiler-errors - 获取 'Missing Lifetime specifier' 错误