我的结构带有其他结构的向量:
pub struct StructB {
value1: u64,
value2: String,
}
pub struct StructA {
array: Vec<StructB>,
}
StructB
是常量;在创建StructA
的过程中,array
充满了从文件中读取并且不太可能被修改的对象。
我想要一个函数来获取与输入参数StructB
相对应的元素get_structB(input: u64) -> &StructB
。为了简单起见,假设假设其他人正在检查边界,我们将只返回具有给定索引的元素。
我很难在Rust中实现它。我想返回一种“只读”引用或对不可变但不进行复制的对象的引用。我不知道这样做的正确方法。
impl StructA {
fn get_structB(&self, idx: u64) -> Box<StructB> { // Or should I use here Rc?
// Here I don't want to consume self just return reference wrapped to the idx element
// Should I implement something like as_ref() for the StructA?
self.array[idx] // That of course won't compile
}
}
答案 0 :(得分:0)
impl StructA {
fn get_structB(&self, i: usize) -> &StructB {
return &self.array[i];
}
}
这可以解决问题。但是,如果编写以下内容,则可能会遇到一些问题:
// `a` is a StructA instance
let bb = a.get_struct_b(0);
println!("{:?}", bb);
drop(a); // move out of `a` occurs here
println!("{:?}", bb); // borrow of `a` is used here
您将必须修改结构定义并使用Rc
来编写函数。 Rc
引入了一点性能影响,并使代码更加复杂,因此,仅当您知道移动StructA
后将使用数据时,才可能要使用它。
pub struct StructA {
array: Vec<Rc<StructB>>,
}
impl StructA {
fn get_structB(&self, i: usize) -> Rc<StructB> {
return Rc::clone(self.array[i]);
}
}