pointers - 修改原始值时更改借用值

标签 pointers rust mutable

首先,这是我正在编写的代码的简化版本:

struct Object {
    size: f32
}

impl Object {
    fn on_event(&mut self) {
        self.size += 1.0;
        println!("Object notified. New size: {}.", self.size);
    }
}

struct Manager<'a> {
    objects: Vec<&'a mut Object>
}

impl<'a> Manager<'a> {
    fn add(&mut self, obj: &'a mut Object) {
        self.objects.push(obj);
    }
    fn notify_objects(&mut self) {
        for i in range(0u, self.objects.len()) {
            let ref mut obj = *self.objects.get_mut(i);
            obj.on_event();
        }
    }
}

fn main() {
    let mut obj1 = Object { size: 1.0 };
    let mut obj2 = Object { size: 2.0 };
    let mut obj3 = Object { size: 3.0 };

    let mut manager = Manager { objects: Vec::new() };
    manager.add(&mut obj1);
    manager.add(&mut obj2);
    manager.add(&mut obj3);

    obj1.size = 25.0;
    println!("before {}", obj1.size); // should print 25

    manager.notify_objects();

    println!("after {}", obj1.size); should print 26
}

所以我喜欢创建可变对象并将它们添加到管理器中,但我应该能够修改原始对象,如代码中所示。

最佳答案

仅供引用,虽然接受的答案是完全正确的,但您可能会遇到许多情况,从其他位置访问对象并不像简单的 mutable-borrow-back-from-owner 那样方便。

例如,如果您正在执行某种观察者模式,其中一个位置正在使用对象,而另一个位置正在监视对象的状态更改,并在状态更改时运行某些内容。

在这些情况下,您可能最好使用 RefCell ( http://doc.rust-lang.org/std/cell/struct.RefCell.html );您可以在多个位置拥有对对象的引用,并使用“try_borrow()”来获取要在特定子范围内查看的临时实例。

在您的示例中,这可能有点矫枉过正,但当您遇到更复杂的情况时,这就是对对象进行“多个引用”的通用解决方案。

关于pointers - 修改原始值时更改借用值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24789652/

相关文章:

rust - 由于类型不匹配错误,文本文件解析函数无法编译

haskell - 是否有类似于可变数组的 MArray 类的引用类型类?

python - Python中的可变字符串

c# - Fundamental .NET - 如何引用 'stored/resolved'

c - 为什么这个交换工作而另一个不工作

rust - Option::map 的结果不够长

eclipse - Sublime 3 和 eclipse 之类的 Rust 内容辅助

parameters - Pyomo:如何更新现有模型实例的约束定义?

C++ 复制指针

c - 使用结构体指针作为函数参数时得到错误的值