Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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会忽略&;的寿命检查;str? fn main(){ 让strA=“a”; 让结果; { 让strB=“abc”; 结果=最长(strA,strB);//将返回strB } println!(“最长的字符串是{}”,result);//result现在指向strB!! } fn.y.len(){ x }否则{ Y } }_Rust_Lifetime_Borrow Checker_Ownership_Borrowing - Fatal编程技术网

为什么rust会忽略&;的寿命检查;str? fn main(){ 让strA=“a”; 让结果; { 让strB=“abc”; 结果=最长(strA,strB);//将返回strB } println!(“最长的字符串是{}”,result);//result现在指向strB!! } fn.y.len(){ x }否则{ Y } }

为什么rust会忽略&;的寿命检查;str? fn main(){ 让strA=“a”; 让结果; { 让strB=“abc”; 结果=最长(strA,strB);//将返回strB } println!(“最长的字符串是{}”,result);//result现在指向strB!! } fn.y.len(){ x }否则{ Y } },rust,lifetime,borrow-checker,ownership,borrowing,Rust,Lifetime,Borrow Checker,Ownership,Borrowing,当我从 'a的具体寿命等于x和y 那么为什么strB现在在其范围之外可见呢?生存期'a指的是字符串缓冲区str的生存期,而不是对该缓冲区的引用。因此,&strstrB的生存期在块内。但是,“abc”是一个常量字符串。这意味着str缓冲区的存储有的静态生存期,这意味着它保证在任何其他生存期内都能生存。因此,即使在strB不再引用该缓冲区之后,result引用该缓冲区也是有效的。这是因为所有字符串文字都有的静态生存期: 我们需要讨论的一个特殊生命周期是“静态”,这意味着该引用可以在整个程序期间有效。

当我从

'a
的具体寿命等于
x
y


那么为什么strB现在在其范围之外可见呢?

生存期
'a
指的是字符串缓冲区
str
的生存期,而不是对该缓冲区的引用。因此,
&str
strB
的生存期在块内。但是,
“abc”
是一个常量字符串。这意味着str缓冲区的存储有
的静态
生存期,这意味着它保证在任何其他生存期内都能生存。因此,即使在
strB
不再引用该缓冲区之后,result引用该缓冲区也是有效的。

这是因为所有字符串文字都有
的静态
生存期:

我们需要讨论的一个特殊生命周期是“静态”,这意味着该引用可以在整个程序期间有效。所有字符串文字都有“静态生存期”,我们可以按如下注释:

让我们:&'static str=“我有一个静态生命周期。”;
该字符串的文本直接存储在程序的二进制文件中,该文件始终可用。因此,所有字符串文字的生存期都是“静态的”

固定示例:

fn main(){
设strA=“a”。to_string();
让结果;
{
设strB=“abc”。to_string();
结果=最长(&strA,&strB);//将返回strB
}
println!(“最长的字符串是{}”,result);//编译错误
}
fn.y.len(){
x
}否则{
Y
}
}
现在生成预期的编译器错误:

错误[E0597]:`strB`寿命不够长
-->src/main.rs:7:33
|
7 |结果=最长(&strA和&strB);//将返回strB
|^^^^^^借来的价值寿命不够长
8  |     }
|-‘strB’在借的时候掉在这里了
9  | 
10 | println!(“最长的字符串是{}”,result);//结果现在指向strB!!
|----借来以后用在这里

Rust并没有“忽略”初始示例中字符串变量的生命周期。当您将一个变量设置为字符串文字时,该文字将硬编码到可执行二进制文件中,并获得一个
“静态”
生存期,这意味着它在整个程序期间都有效。如果我们将显式类型注释添加到初始示例中,则应该清楚它编译和工作的原因:

fn main(){
设strA:&'static str=“a”;
让结果;
{
设strB:&'static str=“abc”;
结果=最长(&strA,&strB);//返回“static str”
}
println!(“最长的字符串是{}”,result);//打印结果
}
fn.y.len(){
x
}否则{
Y
}
}

然而,当我们对字符串文本调用
to_string()
时,我们会创建一个拥有的和堆分配的
string
,它的生存期是非静态的,并且作用于它所在的任何块,因此进行更改会使程序不再按预期编译。

这是否回答了您的问题?