rust - 在方法中使用结构字段会导致不可变自借?
问题描述
我正在尝试实现一个名为 EventManager 的结构,它建立一个通道并监听该通道上的发送以添加到内部队列。
事件管理器-
pub enum Event {
Queued(String),
Immediate(String, String)
}
pub struct EventManager {
events: Vec<String>,
receiver: Option<Receiver<Event>>,
}
impl EventManager {
pub fn new() -> EventManager {
let ev = EventManager {
events: Vec::new(),
receiver: None
};
ev
}
pub fn open_channel(&mut self) -> Sender<Event> {
let (tx, rx) = mpsc::channel();
self.receiver = Some(rx);
tx
}
pub fn listen(&mut self) {
let r = self.receiver.as_ref().unwrap();
loop {
match r.recv() {
Ok(Event::Queued(event_string)) => { self.queue(event_string); },
_ => {},
}
}
}
fn queue(&mut self, event_string: String) {
self.events.push(event_string);
}
}
执行-
fn main() {
let mut ev = EventManager::new();
let publisher = ev.open_channel();
thread::spawn(move || {
ev.listen();
});
publisher.send(Event::Queued(String::from("Hello")));
}
但这给了我编译错误-
error[E0502]: cannot borrow `*self` as mutable because it is also borrowed as immutable
--> src\event_manager.rs:34:54
|
30 | let r = self.receiver.as_ref().unwrap();
| ------------- immutable borrow occurs here
...
33 | match r.recv() {
| - immutable borrow later used here
34 | Ok(Event::Queued(event_string)) => { self.queue(event_string); },
| ^^^^^^^^^^^^^^^^^^^^^^^^ mutable borrow occurs here
似乎这self.receiver
导致了self
. 后来我试图self
在调用该queue
方法时进行可变借用。
我的困惑是为什么不可变借用在我从中拉出一个字段后仍然存在。当它到达时,除了方法本身的可变借用之外self.queue
,不应该没有借用者吗?self
解决方案
推荐阅读
- laravel - Laravel Backpack CRUDController 返回 redirect() 或跳过中间件运行 redirect()
- php - WooCommerce:排序问题:选择的 orderby 值覆盖过滤器值
- google-sheets-formula - 在 Google 表格中查询行和列的总计
- python - 如何将烧瓶中的 reqParser 转换为 python 中的 faspapi?
- java - 一个用于一元和双向流的 grpc 服务器,带有 netty
- node.js - 如何在快速验证器中验证对象数组
- asynchronous - 如何限制 async_trait 函数的返回值来实现同步?
- .htaccess - 重写 url .htaccess GET-Parameter 用于目录路由
- c# - 是否有 MQTTnet 客户端方法的同步版本?
- regex - 使用正则表达式检测没有摘要的方法