Я пытаюсь реализовать структуру под названием EventManager, которая устанавливает канал и прослушивает отправку по этому каналу для добавления во внутреннюю очередь.
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
, кроме изменяемого заимствования самого метода?