rust 需要一个可变的向量在一个结构

n9vozmp4  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(64)

我需要一个可变的vector来包含对结构体内部其他对象的引用。Rust抱怨我不能在结构体内部使用'let',但我仍然没有找到在线Rust Book中列出的让编译器满意的方法。
元对象协议结构体需要一个私有容器来存储其他对象的地址,Rust中有没有办法做到这一点?

pub struct MetaObjectProtocol {
    // Metaobject Registry
    // Container holding references to all existing Metaobjects
    let mut mop_registry = Vec<MetaObject>;
}

字符串

hmmo2u0o

hmmo2u0o1#

我需要一个可变的vector来包含对结构中其他对象的引用。
暂时忽略“references”部分:然后你需要一个结构体的 field。字段是用它们的名称和类型声明的;没有let。这段代码将编译:

pub struct MetaObjectProtocol {
    /// Metaobject Registry
    mop_registry: Vec<MetaObject>,
}

字符串
(All默认情况下,字段是私有的。)现在,至于问题的其余部分:你也在评论中提到:
我对Rust的理解是,除非另有说明,否则一切都是不可变的。
这是不正确的。除非另有说明,否则一切都是 * 唯一拥有的 *。它的所有者可以改变它,而其他人根本无法访问它。let mut对于变量来说是一种奇怪的情况,因为没有mut,你就得到了所有权,但 * 没有 * 可变性;但这不会影响类型和函数签名--所以你可以随时将mut添加到let中,而不会改变程序其余部分的含义。
所以,如果MetaObject s被MetaObjectProtocol拥有,上面的声明是合适的。但是你说“references to”,你可能不想要Rust &引用,因为那些 * 在它们存在时禁止突变 *,并且它们带有 * 生存期 *,为了正确安排它们,这可能是相当严格的。
如果您想在此注册表和其他所有者之间共享对MetaObject的访问,则可能需要使用Arc。(或者Rc,它的仅单线程相对)。然而,这是一个相当复杂的主题,在这里写一个完整的教程是不合适的;我鼓励你阅读,或者继续阅读“the Rust Book”,直到你到达the chapter on Rc。前面的章节将涵盖你需要知道的许多事情,以成功地编写一个复杂的Rust程序,并把RcArc放在上下文中。

相关问题