如何返回对结构中嵌套条目的子元素的引用?

时间:2019-05-28 10:11:24

标签: rust ownership

我的结构带有其他结构的向量:

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
    }
}

1 个答案:

答案 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]);
    }
}