【发布时间】:2020-04-09 08:38:06
【问题描述】:
我正在尝试将对 self 的引用传递给作为字段变量的子结构
use std::cell::RefCell;
use std::rc::Rc;
pub struct BUS {
pub processor: CPU,
pub ram: [u8; 65536],
}
impl BUS {
pub fn new() -> BUS {
BUS {
processor: CPU::new(),
ram: [0; 65536],
}
}
pub fn setup(&mut self) {
self.processor.connect_bus(Rc::new(RefCell::new(self)));
self.ram.iter_mut().for_each(|x| *x = 00);
}
pub fn write(&mut self, addr: u16, data: u8) {
self.ram[addr as usize] = data;
}
pub fn read(&mut self, addr: u16, _read_only: bool) -> u8 {
self.ram[addr as usize]
}
}
pub struct CPU {
bus_ptr: Rc<RefCell<BUS>>,
}
impl CPU {
pub fn new() -> CPU {
CPU {
bus_ptr: Rc::new(RefCell::new(BUS::new())),
}
}
pub fn connect_bus(&mut self, r: Rc<RefCell<BUS>>) {
self.bus_ptr = r;
}
pub fn read_ram(&self, addr: u16, _read_only: bool) -> u8 {
(self.bus_ptr.borrow_mut().read(addr, false))
}
pub fn write_ram(&mut self, addr: u16, data: u8) {
(self.bus_ptr.borrow_mut().write(addr, data))
}
}
fn main() {
let comp = BUS::new();
comp.setup();
}
这个错误:
error[E0308]: mismatched types
--> src/main.rs:18:57
|
18 | self.processor.connect_bus(Rc::new(RefCell::new(self)));
| ^^^^ expected struct `BUS`, found &mut BUS
|
= note: expected type `BUS`
found type `&mut BUS`
我无法将self 传递给RefCell,因为它是第二个可变借用。我通过移动我的函数来解决这个问题,但想知道这种结构的可能性有多大。
我在 C++ 中通过从BUS 传入this 然后在connect_bus 中使用*bus 来实现这一点,这样read_ram 就可以是*bus->read(...)。
是否可以从 CPU 结构上的方法调用 BUS 结构的 read 和 write 函数?
【问题讨论】:
-
看来Why can't I store a value and a reference to that value in the same struct?的答案可能会回答您的问题; How do I express mutually recursive data structures in safe Rust?; .如果没有,请edit您的问题来解释差异。否则,我们可以将此问题标记为已回答。
-
这在 C++ 中是可以实现的——我希望它在所有情况下都不可能。具体来说,尝试在一个函数中构造一个 BUS & CPU 然后返回它。我的猜测是,此时调用方法会导致内存不安全(希望由 Valgrind 报告)。
标签: rust