在本地存储对象后无法计算出处理参考的生命周期

时间:2018-03-31 13:28:46

标签: rust borrow-checker

我试图建立这样的东西(playground):

struct X<'a> {
    s: &'a str,
}

struct Y<'a> {
    list: Vec<X<'a>>,
}

impl<'r> Y<'r> {
    fn process(&mut self, e: &'r X) {
        // do stuff
    }
    fn add(&mut self, e: X<'r>) {
        self.list.push(e);
        let new = self.list.last().unwrap();
        self.process(new)
    }
}

从概念上看这似乎没问题:self有一个列表可以添加一个东西,然后我可以对该东西进行一些进一步处理,因为知道该东西应该存在{{1} }。但是,编译器并不同意:

self

在我看来error[E0495]: cannot infer an appropriate lifetime for lifetime parameter in function call due to conflicting requirements --> src/main.rs:15:29 | 15 | let new = self.list.last().unwrap(); | ^^^^ | note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 13:5... --> src/main.rs:13:5 | 13 | / fn add(&mut self, e: X<'r>) { 14 | | self.list.push(e); 15 | | let new = self.list.last().unwrap(); 16 | | self.process(new) 17 | | } | |_____^ note: ...so that reference does not outlive borrowed content --> src/main.rs:15:19 | 15 | let new = self.list.last().unwrap(); | ^^^^^^^^^ note: but, the lifetime must be valid for the lifetime 'r as defined on the impl at 9:1... --> src/main.rs:9:1 | 9 | impl<'r> Y<'r> { | ^^^^^^^^^^^^^^ = note: ...so that the types are compatible: expected &mut Y<'_> found &mut Y<'r> 应该明确地生活new(虽然可能没有可变参考self那么长?),所以我不明白这里的问题。

2 个答案:

答案 0 :(得分:0)

fn process(&mut self, e: &'r X) {

此签名看起来非常可疑,可能是错误的。请注意,您没有在此指定X的生命周期,而是指定它的生命周期。这可能不是你想要的。

答案 1 :(得分:0)

事实证明,我并不了解引用Vec存储的生命周期是如何工作的。我正在逐步尝试通过可变引用将内容(X的实例)存储到self中,同时使用对这些实例的引用将它们存储在self中。但是,对Vec的引用仅在Vec本身不可变时才是稳定的。

因此,解决方案是从Vec中提取listY),在初始化Y对象之前将其初始化,以便它在整个过程中是不可变的Y对象的生命周期。