我不知道这段代码的生命周期参数。我所尝试的一切通常都会导致编译器错误:
考虑使用显式生命周期参数,如下所示
或者类似
的东西在类型
&'ent Entity<'a, 'ent>
中,引用的生命周期比它所引用的数据的生命周期长。
Entity
, Reference
是简化的版本,以保持这个例子的最小化。
struct Entity<'a> {
id: i32,
name: &'a str,
references: Option<Vec<Reference<'a>>>,
}
struct Reference<'a> {
entity: &'a Entity<'a>,
}
fn main() {
let mut ents: Vec<Entity> = vec![Entity {
id: 0,
name: "Zero",
references: None,
},
Entity {
id: 1,
name: "One",
references: None,
},
Entity {
id: 2,
name: "Two",
references: None,
},
Entity {
id: 3,
name: "Three",
references: None,
}];
let references_ents_id = vec![vec![3, 1, 2], vec![1], vec![0, 3], vec![3, 0]];
create_references(&references_ents_id, &mut ents);
}
fn create_references(refs_id: &Vec<Vec<i32>>, ents_vec: &mut Vec<Entity>) {
for (id_ent, references) in refs_id.iter().enumerate() {
let mut references_of_ent: Vec<Reference> = vec![];
for id_ent in references {
references_of_ent.push(Reference {
entity: ents_vec.iter().find(|ent| ent.id == *id_ent).unwrap(),
});
}
ents_vec[id_ent].references = Some(references_of_ent);
}
}
锈操场
我看错方向了所以,我找到了一个解决方案,但不幸的是,它并不安全。
- 您可以使用
Rc
和Weak
来实现它,以允许节点的共享所有权,尽管这种方法要付出内存管理的代价。 - 可以使用不安全的代码使用原始指针来实现它。这将更有效,但绕过Rust的安全保证。
- 使用
UnsafeCell
.
锈常见问题
关于SO的其他答案
使用原始指针实现不安全版本的示例:
struct Entity<'a> {
id: i32,
name: &'a str,
references: Option<Vec<Reference<'a>>>,
}
struct Reference<'a> {
entity: *const Entity<'a>,
}
Rust Playground: https://play.rust-lang.org/?gist=8237d8cb80a681c981a85610104f2e5c&version=stable&backtrace=0