我需要一个可变向量来包含对结构内部其他对象的引用。Rust 抱怨我无法在结构内部使用“let”,但我仍然没有找到在线 Rust 书中列出的使编译器满意的方法。
元对象协议结构需要有一个私有容器来存储其操作所需的其他对象的地址。Rust 有办法做到这一点吗?
pub struct MetaObjectProtocol {
// Metaobject Registry
// Container holding references to all existing Metaobjects
let mut mop_registry = Vec<MetaObject>;
}
Run Code Online (Sandbox Code Playgroud)
\n\n我需要一个可变向量来包含对结构内部其他对象的引用。
\n
暂时忽略 \xe2\x80\x9creferences\xe2\x80\x9d 部分:那么你需要结构体的一个字段。字段用其名称和类型声明;不let
。该代码将编译:
pub struct MetaObjectProtocol {\n /// Metaobject Registry\n mop_registry: Vec<MetaObject>,\n}\n
Run Code Online (Sandbox Code Playgroud)\n(默认情况下,所有字段都是私有的。)现在,关于问题的其余部分:您还在评论中提到:
\n\n\n我对 Rust 的理解是,除非另有说明,否则一切都是不可变的。
\n
这是不正确的。除非另有说明,一切都是唯一拥有的。它的所有者可以对其进行变异,而其他人根本无法访问它。(let mut
对于变量来说是有点奇怪的情况,因为没有mut
你获得所有权但没有可变性;但这永远不会影响类型和函数签名 \xe2\x80\x94 所以你总是可以添加mut
到 alet
而不改变其余的含义该程序。)
MetaObject
因此,如果s 由 拥有,则上述声明是合适的MetaObjectProtocol
。但是你说 \xe2\x80\x9creferences 到 \xe2\x80\x9d ,你可能不想要 Rust&
引用,因为它们存在时禁止突变,并且它们的生命周期可能非常严格,以便安排他们正确地。
如果您想在该注册表和其他所有者之间共享对此注册表的访问权限,MetaObject
那么您可能需要使用Arc
(或者Rc
,它的单线程相关项)。然而,这是一个相当复杂的主题,在这里编写整个教程是不合适的;我鼓励您阅读或继续阅读\xe2\x80\x9cthe Rust Book\xe2\x80\x9d直到阅读有关Rc
. Rc
前面的章节将涵盖成功编写复杂 Rust 程序并将其置于上下文中所需了解的许多内容Arc
。