关于 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
我最近在学习 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