为什么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
,它的生存期是非静态的,并且作用于它所在的任何块,因此进行更改会使程序不再按预期编译。这是否回答了您的问题?