我在以下代码中抽象了我的问题:
struct List<'a> {
attr: &'a String
}
impl<'a> List<'a> {
fn new() -> List<'a> {
let my_attr = "Something";
List {
attr: &my_attr.to_string()
}
}
}
fn main() {
List::new();
}
它会产生一些通知,并且无法编译声称借用值(my_attr)的寿命不够长。
这是有道理的,所以例如以下确实编译:
struct List<'a> {
attr: &'a String
}
impl<'a> List<'a> {
fn new(my_attr: &'a String) -> List<'a> {
List {
attr: my_attr
}
}
}
fn main() {
let my_attr = "Something".to_string();
List::new(&my_attr);
}
但是,我更喜欢第一种形式,特别是从封装的角度来看。
是否可以在新方法中创建并分配对值的引用(根据失败的示例)?
答案 0 :(得分:2)
这里的问题是&'a String
是借来的值 - 也就是说,它是对存储在别处的值的引用。在你的第一个例子中,“others”是new
函数堆栈,第二个是main
的堆栈。
第二种情况不会出现错误,因为main
的生命周期大于List
的生命周期 - 也就是说,List
会在main
之前死亡1}}完成。您的第一个方案不是这种情况,List
返回new
,因此引用无效。
此处的解决方案是让List
拥有其String
,而不仅仅是引用它。这样,List
的生命周期与其他任何事物无关。
struct List {
attr: String,
}
impl List {
fn new() -> List {
let my_attr = "Something";
List {
attr: my_attr.to_string()
}
}
}