我正在浏览Rust书,并且是在所有权章节。他们有一个汽车样品和四个轮子。车轮知道车主(车),但车子不知道车轮。这让我想到,这个C代码的Rust等价物是什么?
struct Car;
struct Wheel {
int size;
struct Car *owner;
};
struct Car {
char const *name;
Wheel wheels[4];
};
答案 0 :(得分:3)
嗯,字面上的答案是:
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>>
...也许。
我想我所得到的是:明显,直接等效,但如果你真的试图移植语义......你和#39;需要更具体地了解您尝试做的事情,而不是 您尝试做的事情。