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

标签 rust

我在以下代码中抽象了我的问题:

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

这里的解决方案是让 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/

相关文章:

flutter - 如何在 Flutter Web 应用程序中包含 WebAssembly 模块?

rust - HashMap 键的生命周期不够长

rust - 为什么 1 == &2 不编译?

rust - 如何使用泛型方法实现特征?

macros - 我找不到 `mock!` 的定义

rust - 捕获仅在实现中使用的结构中的特征

rust - 在 Rust 中取消引用 Rc<Vec<T>> 混淆

rust - clap::App 多次移动所有权的方法调用

rust - 如何使用本地未发布的箱子?

concurrency - Rust 文档中的进餐哲学家不会同时进餐