请看下面两段代码
fn strcmp<'a>(a: &'a str, b: &'a str) -> &'a str {
if a.len() > b.len() {
a
} else {
b
}
}
fn main() {
let a = "abc";
let result;
{
let b = "abc";
result = strcmp(&a, &b);
} // compile successful
let a : String;
println!("{}", result);
}
上面这一段代码可以编译成功
fn strcmp<'a>(a: &'a str, b: &'a str) -> &'a str {
if a.len() > b.len() {
a
} else {
b
}
}
fn main() {
let a = String::from("abc");
let result;
{
let b = String::from("abc");
result = strcmp(&a, &b);
} // ^^ borrowed value does not live long enough
println!("{}", result);
}
这一段代码编译失败,提示生命周期错误。
这两种情况让我非常困惑,希望各位大佬指教。谢谢。
1
共 3 条评论, 1 页
评论区
写评论你理解错了,
b
的生命周期是 static,不代表 &str 的默认周期是 static。 只不过,b
是 string literal,比较特殊罢了。 对以下内容的回复:明白了,&str的默认周期是 static。
对以下内容的回复:
第一段的
b
是一个 string literal,生命周期为 static。