以rustbook中的代码为例
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
我们有上面的函数,现在假设我们有main:
// can't compile , i understand this part, just post here for reference
fn main1(){
let string1 = String::from("abcd");
let result;
{
let string2 = String::from("xyz"); // we will change this to &str in next example
result = longest(string1.as_str(), string2.as_str());
^^^^^^ doesn't compile , string2 doesn't live long enough
}
println!("The longest string is {}", result);
}
但是如果我们稍微修改一下下面的代码,把string2修改成一个字符串片,这段代码实际上是编译的,我不太清楚是怎么回事,“xyz”仍然算作有效内存吗?
//This compiles. but why? shouldn't ```longest()``` return a smaller lifetime and refuses to compile?
fn main2(){
let string1 = String::from("abcd");
let result;
{
let string2 = "xyz"; // <------ changed
result = longest(string1.as_str(), string2);
}
println!("The longest string is {}", result);
}
3条答案
按热度按时间k4aesqcs1#
字符串的生存期是
'static
(完整的类型是&'static str
),这意味着它将一直生存到程序结束。这是因为字符串被作为数据放入编译后的二进制文件的一个特殊部分,所以只要程序在运行,这些数据也是可以访问的。cwxwcias2#
"xyz"
是&'static str
,它在整个程序期间都有效。6ojccjat3#
string2
总是会被删除,但在第一个例子中,string2
拥有您的数据,在第二个例子中,它只是对’static
数据的引用,因此在删除string2
后,数据不会无效。