rust - 如何在 API 中不暴露 Rc 的情况下共享资源?
问题描述
我正在研究一个几何板条箱,我想为了让事情正常工作,我应该Rc
在引用共享点时使用。例如:
struct Point {
point: Vec4,
}
struct Line {
points: [Rc<Point>; 2],
}
struct Tri {
points: [Weak<Point>; 3],
edges: [Rc<Line>; 3],
}
struct Tetra {
points: [Weak<Point>; 4],
edges: [Weak<Line>; 6],
faces: [Rc<Tri>; 4],
}
这是有道理的,因为它似乎是跟踪单纯形组件的最有效方式。问题出在 API 中。我不想暴露这个Rc
内部,如果我可以传入引用,我会喜欢它。例如,像这样的东西:
let points = [Point::new(p0), Point::new(p1), Point::new(p2), Point::new(p3)];
let tris = [
Tri::new(&points[0], &points[1], &points[2]),
Tri::new(&points[2], &points[3], &points[0])
];
等等,无需用户明确处理Rc
自己。
我们通常在这里看到什么样的模式?
解决方案
如果您希望在没有用户Rc
自己管理 s 的情况下共享资源,您可以照常创建内部结构,并Rc
为您的公共接口创建围绕 s 的包装器。
保持结构不变,但最好使用表明它们是内部的(通常Inner
或Impl
后缀)的命名方案:
struct PointInner {
point: Vec4,
}
struct LineInner {
points: [Rc<PointInner>; 2],
}
struct TriInner {
points: [Weak<PointInner>; 3],
edges: [Rc<LineInner>; 3],
}
struct TetraInner {
points: [Weak<PointInner>; 4],
edges: [Weak<LineInner>; 6],
faces: [Rc<TriInner>; 4],
}
然后创建您的面向用户的类型,它们只是Rc
s 周围的包装器,具有处理内部链接的漂亮外观(您可以inner
像我所做的那样使用字段或使用新类型 structs):
pub struct Point {
inner: Rc<PointInner>,
}
pub struct Line {
inner: Rc<LineInner>,
}
pub struct Tri {
inner: Rc<TriInner>,
}
pub struct Tetra {
inner: Rc<TetraInner>,
}
impl Point {
pub fn new(point: Vec4) -> Point {
Point {
inner: Rc::new(PointInner { point }),
}
}
}
impl Tri {
pub fn new(p1: &Point, p2: &Point, p3: &Point) -> Tri {
Tri {
inner: Rc::new(TriInner {
points: [
Rc::downgrade(&p1.inner),
Rc::downgrade(&p2.inner),
Rc::downgrade(&p3.inner),
],
edges: [
Rc::new(LineInner {
points: [Rc::clone(&p1.inner), Rc::clone(&p2.inner)],
}),
Rc::new(LineInner {
points: [Rc::clone(&p2.inner), Rc::clone(&p3.inner)],
}),
Rc::new(LineInner {
points: [Rc::clone(&p3.inner), Rc::clone(&p1.inner)],
}),
],
}),
}
}
}
有了这个,您想要的代码无需更改即可工作。看到它在操场上工作。
推荐阅读
- r - 如何根据 x 轴上的指定点有选择地为绘图的整个区域着色?
- python - Python:如何创建具有动态参数数量的参数网格
- jpos - jpos : 如何打包 DE 55
- sql - 我的 INSERT 语句与 FOREIGN KEY 约束冲突
- c# - C# 等效于 CreateIoCompletionPort
- uwp - 是否可以在机器范围内安装 Microsoft Store 应用程序?
- javascript - 选中复选框时引导数据表保持全部禁用
- .net-core - 带日期时间的 Odata V4
- python - 输入提示中的 TensorFlow dtypes
- vba - 如果勾选了复选框,有没有办法选择文本框输入?VBA Excel