2015-08-06 8 views
0

Идея проста: есть некоторые приложения, в которых есть некоторые Windows. Windows имеет некоторую ссылку на свое приложение. Им нужно использовать методы других. Я сделал некоторый отрывочный код, но когда я разрешаю одну проблему, я получаю новую.Как разрешить заимствование и изменчивость ад в таком проекте?

struct Win { 
     x: i32, 
     y: i32, 
     last_event: u32, // just for testing 
     app: App, 
} 

impl Win { 
    pub fn new(app: &mut App, x: i32, y: i32) -> Win { 
     let mut win = Win{app: *app, x: x, y: y, last_event: 0}; 
     app.add_window(&mut win); 
     win 
    } 

    fn add_window_to_app(&mut self, app: &mut App) { 
     app.add_window(self); 
    } 

    pub fn on_event(&mut self, event: u32, param1: u32, param2: u32) { 
     self.last_event = event; 
    } 
} 

struct App { 
    pid: u32, 
    windows: Vec<Win>, 
} 

impl App { 
    pub fn new(pid: u32) -> App { 
     let app = App{pid: pid, windows: Vec::<Win>::new()}; 
     app 
    } 

    pub fn add_window(&mut self, win: &mut Win) { 
     self.windows.push(*win); 
    } 

    pub fn on_event(&mut self, win: &mut Win, event: u32, param1: u32, param2: u32) { 
     win.on_event(event, param1, param2); 
    } 
} 

fn main() { 
    let mut app = App::new(1); 
} 

ответ

1

Ideal: сортировать ваш график зависимости, чтобы сделать ациклический, то проверку Заимствования будет работать из коробки.


Практическая: потому что реальность имеет тенденцию быть более сложным, чем хотелось бы, идеальная ситуация может быть невозможно или нецелесообразно. В этом случае вы можете перенести проверку собственности с момента компиляции на время выполнения, используя RefCell (от std::cell).

Это все еще запрещает сглаживание + изменчивость (так что вы не можете мутировать Win, к которому у вас уже есть ссылка, используемая в другом месте), но отложите проверку на время выполнения с небольшим штрафом.


Ответный Ад: реализовать брокер, который владеет как Win с и App с, и имеют Win/App относятся друг к другу с помощью идентификаторов; когда требуется взаимодействие, Win/App отправляет событие брокеру, который обрабатывается асинхронно.

Это отклоняет график владения ценой получения аддона обратного вызова.