从结构方法中创建和分配引用数据
Create and assign reference data from within a struct method
我在以下代码中抽象了我的问题:
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
是借用的值 - 也就是说,它是对存储在别处的值的引用。在您的第一个示例中,"elsewhere" 是 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()
}
}
}
我在以下代码中抽象了我的问题:
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
是借用的值 - 也就是说,它是对存储在别处的值的引用。在您的第一个示例中,"elsewhere" 是 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()
}
}
}