【发布时间】:2021-11-10 17:25:04
【问题描述】:
我正在研究一个几何板条箱,我想为了让事情正常工作,我应该在引用共享点时使用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。
我们通常在这里看到什么样的模式?
【问题讨论】:
-
您需要将它们全部作为共享参考吗?你打算就地改变它们吗?在我看来,
Line拥有两个Points 的唯一所有权更有意义。根据Vec4是什么,您甚至可以摆脱Point : Copy,这样移动它们就更加方便了。 -
这里可能还有其他也不是很明显的假设。例如,用 4 个点,我可以从相同的 4 个顶点制作 6 条线和 4 个三角形。所以这可能很重要,他们的模型可能就是他们需要的。