我最近在研究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/