这个 C 结构的 Rust 等价物是什么?

What is the Rust equivalent of this C structure?

我正在阅读 Rust 书,正在阅读所有权章节。他们有一辆汽车和四个轮子的样品。车轮知道它们的主人(汽车),但汽车不知道它的轮子。这让我开始思考,这个 C 代码的 Rust 等价物是什么?

struct Car;
struct Wheel {
    int size;
    struct Car *owner;
};

struct Car {
    char const *name;
    Wheel wheels[4];
};

嗯,字面上的答案是:

struct Car {
    name: &'static str, // '
    wheels: [Wheel; 4],
}

struct Wheel {
    size: i32,
    owner: *mut Car,
}

但这并不是很大有用的,因为owner不能在unsafe代码之外使用,因为它是一个裸指针。然而,这达到了 Rust 的局限性,因为在实践中不可能有循环借用的引用;也就是说,您不能将 &Car 用于 owner.

这引出了一个问题:在这里,您真正想要表达的是什么? Wheel 实际上 是否需要了解它所附加的 Car?如果没有,你可以直接删除 owner 就没问题了。

如果是这样,你能忍受 unsafe 块来填充你的代码吗(另外:这通常应该是你最后的选择)?如果没有,您需要一些共享所有权的概念。在那种情况下,您是否只需要对该结构的只读访问权限?如果是这样,也许您想要 Rc<Car>。如果不是,您可能需要 Rc<Cell<Car>>... 除非您在线程环境中工作,在这种情况下您将需要 Arc<Mutex<Car>>... 也许。

我想我的意思是:有一个 obvious,直接等价,但如果你真的想移植语义......你会需要更具体地说明您要做什么,而不是如何您要做什么。