如何使用引用同一对象的子结构创建上下文结构?

时间:2016-07-07 18:19:31

标签: rust lifetime borrow-checker

给出以下示例:

struct A;

struct B<'a> {
    ptr: &'a A
}

struct C<'a> {
    ptr: &'a A
}

struct Context<'a> {
    a: A,
    b: B<'a>,
    c: C<'a>
}

fn setup<'a>() -> Context<'a> {
    let a = A;
    let b = B {ptr: &a};
    let c = C {ptr: &a};
    Context {a: a, b: b, c: c}
}

#[test]
fn it_works() {
    let context = setup();
}

编译器基本上抱怨对稍后移动的对象的引用:

error: `a` does not live long enough
    let b = B {ptr: &a};
                     ^
note: reference must be valid for the lifetime 'a as defined on the block at 18:30...
fn setup<'a>() -> Context<'a> {
                              ^
note: ...but borrowed value is only valid for the block suffix following statement 0 at 19:14
    let a = A;
              ^

我明白,只要借用它就不可能摆脱价值(这基本上就是发生的事情)。 但是,应该有一种解决方法,因为数据本身确实存在足够长的时间:ContextBC具有相同的生命周期,因此两个.ptr都有效在任何时候。

有谁知道这方面的解决方案?这种架构的背景:在一个更大的程序中,我希望有一个可以根据需要借用或移动的上下文对象。为了尽可能减少依赖关系并使测试尽可能轻松,子模块尽可能拥有自己的上下文对象(示例中为AB)。应该将不可避免的共享数据存储为参考,如示例所示。

到目前为止,我唯一想到的是使用引用(&a)显式调用每个子模块的函数作为参数,这有点冗长。

0 个答案:

没有答案