【发布时间】:2015-06-14 02:01:44
【问题描述】:
我有两个对象,其中第二个对象需要第一个对象才能生存,因为它包含对第一个对象的引用。我需要将它们都移动到一个线程中,但编译器抱怨第一个活得不够长。代码如下:
use std::thread;
trait Facade: Sync {
fn add(&self) -> u32;
}
struct RoutingNode<'a> {
facade: &'a (Facade + 'a),
}
impl<'a> RoutingNode<'a> {
fn new(facade: &'a Facade) -> RoutingNode<'a> {
RoutingNode { facade: facade }
}
}
fn main() {
struct MyFacade;
impl Facade for MyFacade {
fn add(&self) -> u32 {
999u32
}
}
let facade = MyFacade;
let routing = RoutingNode::new(&facade);
let t = thread::spawn(move || {
let f = facade;
let r = routing;
});
t.join();
}
还有错误:
error: `facade` does not live long enough
--> <anon>:27:37
|
27 | let routing = RoutingNode::new(&facade);
| ^^^^^^ does not live long enough
...
35 | }
| - borrowed value only lives until here
|
= note: borrowed value must be valid for the static lifetime...
我相信我理解错误告诉我的内容:一旦facade 对象被移动到线程,引用将不再有效。但是我无法找到解决这个问题的有效解决方案,假设我想保持结构完好无损。
【问题讨论】:
标签: reference rust move-semantics lifetime lifetime-scoping