Rust 模式匹配后保存向量

Rust 模式匹配后保存向量,rust,pattern-matching,message-passing,Rust,Pattern Matching,Message Passing,我使用的是机器人板条箱的特征: extern crate robots; use std::any::Any; use robots::actors::{Actor, ActorCell}; #[derive(Clone, PartialEq)] pub enum ExampleMessage { Test { data: Vec<u8> }, } pub struct Dummy { data: Vec<u8>, } impl Acto

我使用的是机器人板条箱的特征:

extern crate robots;    

use std::any::Any;
use robots::actors::{Actor, ActorCell};


#[derive(Clone, PartialEq)]
pub enum ExampleMessage {
    Test { data: Vec<u8> },
}

pub struct Dummy {
    data: Vec<u8>,
}

impl Actor for Dummy {
    // Using `Any` is required for actors in RobotS
    fn receive(&self, message: Box<Any>, _context: ActorCell) {
        if let Ok(message) = Box::<Any>::downcast::<ExampleMessage>(message) {
            match *message {
                ExampleMessage::Test { data } => {
                    self.data = data; // cannot assign to immutable field
                    println!("got message")
                }
            }
        }
    }
}

impl Dummy {
    pub fn new(_: ()) -> Dummy {
        let data = Vec::new();
        Dummy { data }
    }
}
错误:

错误:无法分配给不可变字段'self.data'` -> :18:21 | 18 | self.data=数据;//无法分配给不可变字段 | ^^^^^^^^^^^^^^^^
我理解为什么我当前的代码不起作用,但我不知道保存传入数据Vec的最佳方法是什么,以便我的虚拟人以后可以访问它

这里缺少一个简单的要点:您的方法receive get&self作为参数。不能通过&self修改self对象,因为它是一个不可变的引用。为了改变self的任何字段,接受一个可变引用&mutself,或者——如果没有办法——使用内部可变性。例如:

fn receive(&mut self, message: Box<Any>) {
    // ...
    self.data = data;  // works
    // ...
}
但是,如果您不能更改Dummy实现的trait Actor,那么在您的情况下,这可能是不可能的。在这种情况下,您必须使用,例如RefCell。但是如果你能改变这种特性,就考虑这样做。receive方法听起来似乎应该更改self对象以产生任何效果

如果这不仅仅是你自己的一个粗心错误,请务必阅读《铁锈》一书中的章节,因为这对铁锈非常重要。

我在RobotS github repo中发现了一个演示如何管理演员内部状态的程序。 必须将状态封装在互斥锁中,以实现线程安全访问:

extern crate robots;    

use std::any::Any;
use std::sync::Mutex;
use robots::actors::{Actor, ActorCell};


#[derive(Clone, PartialEq)]
pub enum ExampleMessage {
    Test { data: Vec<u8> },
}

pub struct Dummy {
    data: Mutex<Vec<u8>>,
}

impl Actor for Dummy {
    // Using `Any` is required for actors in RobotS
    fn receive(&self, message: Box<Any>, _context: ActorCell) {
        if let Ok(message) = Box::<Any>::downcast::<ExampleMessage>(message) {
            match *message {
                ExampleMessage::Test { data } => {
                    let mut my_data = self.data.lock().unwrap();
                    *my_data = data;
                    println!("got message")
                }
            }
        }
    }
}

impl Dummy {
    pub fn new(_: ()) -> Dummy {
        let data = Mutex::new(Vec::new());
        Dummy { data }
    }
}

我正在为Dummy实现Actor-trait impl-Actor。由于我正在实现trait,我无法使引用可变,因为这将导致不兼容的类型错误。我无法使用RefCell,因为它不满足trait绑定的std::marker::Sync。我在github的机器人报告中发现了一个新的例子。我必须使用互斥,今天晚些时候我会自己写答案。