【发布时间】:2019-05-28 10:11:24
【问题描述】:
我有一个带有其他结构向量的结构:
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
}
}
【问题讨论】:
-
你为什么不用
fn get_structB(&self, idx: usize) -> Option<&StructB> { self.array.get(idx) }? -
@hellow,他可能想将该变量发送到某个可能想要拥有数据本身的线程。 Rc 在这种情况下很有用
-
没关系。只要您只想要只读访问权限,您就可以传递
&StructB。RC这里不需要恕我直言。 -
是的,我认为在这里引用选项应该没问题。只是不同的 Rust Wrappers 的数量让我多次思考应该在哪里使用什么。选项给了我一些与 Enum 之类的关联?所以这就是为什么我开始思考智能指针之类的东西。
-
@Mazeryt 在对象没有明确的“所有者”时使用
Rc/Arc。感觉会更OO,因为它本质上是添加了一个简单的GC。