这个 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,直接等价,但如果你真的想移植语义......你会需要更具体地说明您要做什么,而不是如何您要做什么。
我正在阅读 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,直接等价,但如果你真的想移植语义......你会需要更具体地说明您要做什么,而不是如何您要做什么。