如何转让所有权或从结构中提取可变引用

时间:2018-08-17 11:37:46

标签: rust

考虑以下代码:

struct Event {
    id: i32,
}

struct EventsLoop;
impl EventsLoop {
    pub fn new() -> EventsLoop {
        EventsLoop {}
    }

    pub fn poll_events<F>(&mut self, _callback: F)
    where
        F: FnMut(Event),
    {
        // gets event and passes it to the callback
    }
}

struct Store {
    events_loop: EventsLoop,
    running: bool,
}

fn main() {
    let store = setup_store();
    run_app(store);
}

fn setup_store() -> Store {
    Store {
        events_loop: EventsLoop::new(),
        running: true,
    }
}

fn run_app(mut store: Store) {
    let mut e_loop = store.events_loop;
    e_loop.poll_events(|event| {
        // poll_events needs EventsLoop as a mutable reference
        match event {
            Event { id: -1 } => {
                store.running = false;
            }
            _ => { /* store is used in other events */ }
        }
    })
}

这导致编译器抱怨:

error[E0382]: capture of partially moved value: `store`
  --> src/main.rs:38:24
   |
37 |     let mut e_loop = store.events_loop;
   |         ---------- value moved here
38 |     e_loop.poll_events(|event| {
   |                        ^^^^^^^ value captured here after move
   |
   = note: move occurs because `store.events_loop` has type `EventsLoop`, which does not implement the `Copy` trait

我有一个需要借用或拥有store所有权的闭包。同时,我需要store.events_loop作为可变引用(由于其方法poll_events)。我认为也许可以通过将EventsLoop的所有权从store传递到函数范围来解决多重可变借入问题。所以我的第一个问题是:

  1. 可以通过某种方式将EventsLoop移出store来解决此问题吗?

我想到的另一种解决方案是将store传递给run_app作为不可变的引用,并将字段running包裹在Cell中,但是随后我需要某种方法智能指针以获取EventsLoop作为可变参考。所以这引出了我的第二个问题:

  1. 当将events_loop作为不可变引用传递时,是否有一种方法可以从store中提取store作为可变引用?

编辑:

我很抱歉在我的第一篇文章中没有MVCE。当前示例应重现该问题。 已建议此问题重复到Mutably borrow one struct field while borrowing another in a closure 这里的情况类似但不同。 链接中的问题是关于一个结构中的两个字段的,使用闭包中一个结构中的一个字段,该字段传递给另一个字段中的方法。 这个问题是关于在闭包中使用结构的,闭包被传递给该结构内部的字段的方法。 这里的要点是,我希望能够在闭包中访问存储,同时还可以从存储中获取事件循环。这个想法是在setup_store初始化时创建的所有数据结构-包括事件循环-都进入单个结构。

0 个答案:

没有答案