容器对象的 Rust 模式

标签 rust

我有一个拥有各种其他结构的结构,例如

pub struct Computer {
  monitor: Monitor,
  keyboard: Keyboard,
  mouse: Mouse,
  printer: Printer
}
其中一些子对象相互需要,这会导致构建错误,例如“不能一次多次借用可变”。
self.mouse.change_orientation(&mut self.keyboard);

impl Mouse {
  fn change_orientation(&mut self, keyboard: &mut Keyboard) {  
    // ignore the fact that the example does not make much sense,
    // for some reason this method really needs to mutate both the mouse
    // and the keyboard
  }
}
如果您来自更多的 OOP 背景,我可以想象这是一个常见的问题/模式。有一个容器对象,它拥有执行不同任务的较小对象。当这些小对象中的一个需要引用另一个时,就 Rust 而言,该引用与容器对象相关联。
您将如何重构此代码以使其与 Rust 一起使用?我有点犹豫要不要继续 Rc<RefCell一切,因为我确实喜欢编译时借用检查器的好处。
编辑:抱歉,我犯了一个错误。正如评论中所指出的,我提供的示例确实有效。我的错。我在实际代码中试图做的是将整个容器作为可变引用传递,这当然不应该工作。

最佳答案

通常,这些问题可以通过借位拆分来解决:https://doc.rust-lang.org/nomicon/borrow-splitting.html
IE。你明确地让编译器明白你正在改变两个独立的实体。

关于容器对象的 Rust 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66329623/

相关文章:

hashmap - 为什么 csv::Reader 记录中的字符串在插入到 HashMap 中时生命周期不够长?

iterator - 如何编写返回对自身的引用的迭代器?

rust - 尝试从循环内部设置循环外部的变量时,值的生存时间不够长

reference - 当旧的枚举被丢弃时,有没有一种方法可以从 &mut 枚举中提取值?

rust - 无法使用完全限定的语法来装箱未大小的类型

mysql - 如何在柴油模型.rs中用空格写列名?

rust - Box<Any> 在 dylib 模块中向下转换返回 None

rust - 过滤与迭代器中模式匹配的值的惯用方法

rust - Supertrait 仅当 Self : Sized

rust - 除非用 `mut` 另行指定,否则为什么在 Rust 中强制执行不可变性?