Использование структурных полей в методах вызывает неизменяемую самостоятельную заимствование? - PullRequest
0 голосов
/ 12 июля 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...