gpt4 book ai didi

rust - 是否可以从子结构调用父结构的方法?

转载 作者:行者123 更新时间:2023-12-03 11:42:05 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Why can't I store a value and a reference to that value in the same struct?

(3 个回答)



How do I express mutually recursive data structures in safe Rust?

(3 个回答)



Pass self reference to contained object's function

(2 个回答)



Passing mutable self reference to method of owned object

(2 个回答)


2年前关闭。




我正在尝试将对 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();
}

Rust Playground

这个错误:

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`

我无法通过 selfRefCell因为它是第二个可变借用。我通过移动我的函数来解决这个问题,但想知道这种结构的可能性有多大。

我通过传入 this 在 C++ 中实现了这一点来自 BUS然后使用 *busconnect_bus这样 read_ram可以是 *bus->read(...) .

是否可以调用 BUS 结构的 readwrite CPU结构上的方法的函数?

最佳答案

最简洁的答案是不。

  • RefCell拥有它的内部对象。这意味着它拥有该对象的唯一副本,因此它可以完全控制对其的所有访问,并且不允许来自外部的任何其他访问。 RefCell 中不能存在对象和 RefCell 之外同时。

    您的 setup可以采用现有的 Rc<RefCell<BUS>>而是传递它。 &mut BUS没有包装是不行的。
  • 借用检查器不能确保相互亲子关系的安全。它希望程序数据结构化为树或 DAG。否则,您将不得不使用包装类型或类似 C 的原始指针。

  • 借用检查器检查接口(interface),而不是实现。如果您的 setter 借用 &mut self ,这是整个对象的唯一借用,对于借用检查,这是最严格和最不灵活的选择。您将需要剥离一些抽象层才能完成这项工作,例如将RAM向下传递给CPU。或者,使 RAM 使用 Cell<u8>类型,以便它可以通过共享引用进行变异。

    关于rust - 是否可以从子结构调用父结构的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59364133/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com