我需要一个可变的vector来包含对结构体内部其他对象的引用。Rust抱怨我不能在结构体内部使用'let',但我仍然没有找到在线Rust Book中列出的让编译器满意的方法。
元对象协议结构体需要一个私有容器来存储其他对象的地址,Rust中有没有办法做到这一点?
pub struct MetaObjectProtocol {
// Metaobject Registry
// Container holding references to all existing Metaobjects
let mut mop_registry = Vec<MetaObject>;
}
字符串
1条答案
按热度按时间hmmo2u0o1#
我需要一个可变的vector来包含对结构中其他对象的引用。
暂时忽略“references”部分:然后你需要一个结构体的 field。字段是用它们的名称和类型声明的;没有
let
。这段代码将编译:字符串
(All默认情况下,字段是私有的。)现在,至于问题的其余部分:你也在评论中提到:
我对Rust的理解是,除非另有说明,否则一切都是不可变的。
这是不正确的。除非另有说明,否则一切都是 * 唯一拥有的 *。它的所有者可以改变它,而其他人根本无法访问它。(
let mut
对于变量来说是一种奇怪的情况,因为没有mut
,你就得到了所有权,但 * 没有 * 可变性;但这不会影响类型和函数签名--所以你可以随时将mut
添加到let
中,而不会改变程序其余部分的含义。所以,如果
MetaObject
s被MetaObjectProtocol
拥有,上面的声明是合适的。但是你说“references to”,你可能不想要Rust&
引用,因为那些 * 在它们存在时禁止突变 *,并且它们带有 * 生存期 *,为了正确安排它们,这可能是相当严格的。如果您想在此注册表和其他所有者之间共享对
MetaObject
的访问,则可能需要使用Arc
。(或者Rc
,它的仅单线程相对)。然而,这是一个相当复杂的主题,在这里写一个完整的教程是不合适的;我鼓励你阅读,或者继续阅读“the Rust Book”,直到你到达the chapter onRc
。前面的章节将涵盖你需要知道的许多事情,以成功地编写一个复杂的Rust程序,并把Rc
和Arc
放在上下文中。