Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 关于锈蚀静态寿命和范围的问题_Rust_Static_Lifetime - Fatal编程技术网

Rust 关于锈蚀静态寿命和范围的问题

Rust 关于锈蚀静态寿命和范围的问题,rust,static,lifetime,Rust,Static,Lifetime,我最近在学习生锈,但在一生中停止。有人能帮我吗? 我试图使用静态生存期生成字符串文字,但当它超出范围时,引用 不能再使用了 fn main(){ { let s: &'static str = "hello world"; } println("s={}",s); } 我得到一个错误:在此范围内找不到 我正在尝试使用静态关键字 fn main(){ { static s: &'static str = "hel

我最近在学习生锈,但在一生中停止。有人能帮我吗? 我试图使用静态生存期生成字符串文字,但当它超出范围时,引用 不能再使用了

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在这里以“{”开头
让foo=foo::new();//在作用域内创建一个新变量
}//作用域在此结束。作用域内所有的值都被释放。
//福在这里是不可接近的
}
即使变量的生存期大于封闭范围,也不意味着您可以在范围之外访问它。相反,生存期只是告诉您某个变量的有效期

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

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

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

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

static s:&str=“Hello World!”;//注意,“static”是隐式的

范围与生存期不是一回事。在大多数情况下,它们是相似的:

fn main(){
{//scope在这里以“{”开头
让foo=foo::new();//在作用域内创建一个新变量
}//作用域在此结束。作用域内所有的值都被释放。
//福在这里是不可接近的
}
即使变量的生存期大于封闭范围,也不意味着您可以在范围之外访问它。相反,生存期只是告诉您某个变量的有效期

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

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

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

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

static s:&str=“Hello World!”;//注意,“static”是隐式的