rust - 模式匹配后保存 Vec

标签 rust pattern-matching message-passing

我正在使用 Actor来自机器人箱子的特征:

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 }
    }
}

错误:

error: cannot assign to immutable field `self.data`
  --> <anon>:18:21
   |
18 |                     self.data = data; // cannot assign to immutable field
   |                     ^^^^^^^^^^^^^^^^

我明白为什么我当前的代码不起作用,但我不知道保存传入数据 (Vec) 的最佳方法是什么,所以我的 Dummy以后可以访问它。

最佳答案

您在这里遗漏了一个简单的要点:您的方法 receive()得到 &self作为参数。您不能修改 self通过 &self 对象因为它是一个不可变 引用。为了更改 self 的任何字段,接受一个可变引用(&mut self)或者——如果没有办法绕过它——使用内部可变性。示例:

fn receive(&mut self, message: Box<Any>) {
    // ...
    self.data = data;  // works
    // ...
}

但如果您不能更改特征 Actor,这在您的情况下可能是不可能的哪个Dummy实现。在那种情况下,您必须使用interior mutability ,例如RefCell<Vec<u8>> .但如果你能改变这个特质,考虑这样做。方法receive()已经听起来像 self应该更改对象以使其完全没有任何效果。

如果这不仅仅是您的粗心错误,请务必阅读 Borrowing 上的章节和 Mutability在 Rust 书中,因为这对 Rust 非常重要。

关于rust - 模式匹配后保存 Vec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43733518/

相关文章:

rust - 处理传递给过程宏的编译时相关文本文件的正确方法

pattern-matching - 在类型上使用 'with sexp' 生成 "Warning 4: this pattern-matching is fragile"

javascript - 为什么我无法将此消息传递给选项卡中运行的所有框架?

javascript - Chrome 扩展消息传递 - 如何传递 HTML

rust - 生成迭代器,该迭代器给出对自身的引用

rust - 如何为内部 API 编写文档测试?

rust - 将 Cargo 与我的项目自己的目录结构一起使用

string - 如何在lua中string.find方括号字符?

algorithm - 无序树模式匹配算法

javascript - 从弹出窗口发送消息到内容脚本的 chrome 扩展