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

时间:2015-01-21 20:01:11

标签: 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);
}

但是,我更喜欢第一种形式,特别是从封装的角度来看。

是否可以在新方法中创建并分配对值的引用(根据失败的示例)?

1 个答案:

答案 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()
        }
    }
}