rust - 暂时持有借来的元素

标签 rust mutability borrow-checker borrowing

struct Parent<'a> {
    inner: Option<&'a mut Object>
}
impl<'a> Parent<'a> {
    fn new() -> Parent<'a> {
        Parent {
            inner: None,
        }
    }
    fn bind(&mut self, obj: &'a mut Object) {
        self.inner = Some(obj);
    }
    fn unbind(&mut self) {
        self.inner = None;
    }
}
struct Object {
    inner: u32,
}
fn main() {
    let mut obj = Object { inner: 0 };
    let mut parent1 = Parent::new();
    let mut parent2 = Parent::new();
    parent1.bind(&mut obj);
    parent1.unbind();
    // parent2.bind(&mut obj);
    // ^ error

}

结构Parent字段必须存储Option:

struct Parent {
    inner: Option</*  magic  */>
}

有必要暂时阻止在 fn main() 中使用对象的可能性,直到调用 .unbind()

最佳答案

借用检查器不可能在编译时证明这是正确的。但是您可以使用 RefCell 来确保它在运行时正常工作,并且如果您做错了会出现 panic 。您可以存储一个允许修改对象的 RefMut,而不是在 Parent 对象中存储对该对象的引用。 bind 函数获取对 RefCell 的引用,如果该对象已被借用,则会出现 panic。

use std::cell::*;

struct Parent<'a> {
    inner: Option<RefMut<'a, Object>>,
}
impl<'a> Parent<'a> {
    fn new() -> Parent<'a> {
        Parent {
            inner: None,
        }
    }
    fn bind(&mut self, obj: &'a RefCell<Object>) {
        self.inner = Some(obj.borrow_mut());
    }
    fn unbind(&mut self) {
        self.inner = None;
    }
}
struct Object {
    inner: u32,
}
fn main() {
    let obj = RefCell::new(Object { inner: 0 });
    let mut parent1 = Parent::new();
    parent1.bind(&obj);
    parent1.unbind(); // comment this line out and you get a runtime panic
    let mut parent2 = Parent::new();
    parent2.bind(&obj);
}

关于rust - 暂时持有借来的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33562359/

相关文章:

post - 如何修复 Rocket 中表单 POST 请求的解析错误?

rust - 如何找出可用的方法?

dynamic - 如何在actix_web/rust的http响应中流式传输非静态字节?

scala - 为什么在 Scala 中不能用 `var` 覆盖 `def`?

rust - Rust 函数的返回类型中的闭包

copy - 如何轻松地将非 mut &[u8] 复制到 &mut [u8]

java - 在 Java 中,是否将对象的非基元包含字段传递给作为对象句柄传递的方法,如果是这样,这会如何影响其可变性?

reference - 尝试转移所有权时无法移出借用的内容

rust - 为什么 Rust borrow checker 会忽略函数参数中的可变指针?

data-structures - Rust 中的树遍历 vs Borrow Checker