这是代码
fn main() {
let n = String::from("rust");
let myname;
{
let obj = AA{
name: &n
};
myname = obj.get_name();
}
println!("{}", myname)
}
struct AA<'a>{
name: &'a str
}
impl <'a> AA<'a>{
fn get_name(&self) -> & str{
return &self.name;
}
}
按照文档来说,下面的报错能理解,因为 myname 的生命周期应该和 obj 是一样的,出了作用范围就被编译器检查出来了
error[E0597]: `obj` does not live long enough
--> src/main.rs:14:18
|
14 | myname = obj.get_name();
| ^^^^^^^^^^^^^^ borrowed value does not live long enough
15 | }
| - `obj` dropped here while still borrowed
16 | println!("{}", myname)
| ------ borrow later used here
但是,如果我把方法返回值写明返回的生命周期,如下
impl <'a> AA<'a>{
fn get_name(&self) -> &'a str{
return &self.name;
}
}
这样能正常运行
warning: `hello_cargo` (bin "hello_cargo") generated 4 warnings
Finished dev [unoptimized + debuginfo] target(s) in 0.45s
Running `target/debug/hello_cargo`
rust
疑问:为什么会产生这样的区别,按照生命周期省略规则的第三条规则来说默认的返回生命周期是&self 的,也就是 obj 的,这个生命周期和'a 是不一样的吗
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.