给出以下示例:
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;
^
我明白,只要借用它就不可能摆脱价值(这基本上就是发生的事情)。
但是,应该有一种解决方法,因为数据本身确实存在足够长的时间:Context
与B
和C
具有相同的生命周期,因此两个.ptr
都有效在任何时候。
有谁知道这方面的解决方案?这种架构的背景:在一个更大的程序中,我希望有一个可以根据需要借用或移动的上下文对象。为了尽可能减少依赖关系并使测试尽可能轻松,子模块尽可能拥有自己的上下文对象(示例中为A
和B
)。应该将不可避免的共享数据存储为参考,如示例所示。
到目前为止,我唯一想到的是使用引用(&a
)显式调用每个子模块的函数作为参数,这有点冗长。