从结构方法中创建和分配引用数据

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 结束。这不是第一个场景的情况,Listnew 返回,因此引用无效。

这里的解决方案是让 List 拥有它的 String,而不是仅仅引用它。这样,List 的生命周期就不会与其他任何东西相关联。

struct List {
    attr: String,
}

impl List {
    fn new() -> List {
        let my_attr = "Something";

        List {
            attr: my_attr.to_string()
        }
    }
}