我在以下代码中抽象了我的问题:
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);
}
不过,我更喜欢第一种形式,尤其是从封装的角度来看。
是否可以在新方法中创建并分配对值的引用(根据失败的示例)?
最佳答案
这里的问题是 &'a String
是借用的值——也就是说,它是对存储在别处的值的引用。在您的第一个示例中,“其他地方”是 new
函数堆栈,而在第二个示例中,它是 main
的堆栈。
第二种情况不会出错,因为 main
的生命周期大于 List
的生命周期 - 即 List
将在 main
完成之前结束。这不是第一个场景的情况,List
由 new
返回,因此引用无效。
这里的解决方案是让 List
拥有它的 String
,而不是仅仅引用它。这样,List
的生命周期就不会与其他任何东西相关联。
struct List {
attr: String,
}
impl List {
fn new() -> List {
let my_attr = "Something";
List {
attr: my_attr.to_string()
}
}
}
关于rust - 从结构方法中创建和分配引用数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28075834/