为什么我会获得一个借来的内容"尝试从一个带有& self的方法返回Vec时出错?

时间:2017-08-10 17:30:10

标签: rust

是的我有read the docs三次

我看过:Cannot move out of borrowed content in RustCannot move out of borrowed content。这些都不能回答我的问题或帮助我更好地理解这里发生的事情。

请考虑以下代码段:

pub trait Scene {
    fn on_start(&mut self) {}
    fn update(&mut self) {}
    fn stop(&mut self) {}
    fn is_active(&self) -> bool { return false; }
}

pub struct SceneManager {
    scenes: Vec<Box<Scene>>
}

impl SceneManager {
    fn new<T>(mut scene: T) -> SceneManager where T: Scene + 'static {
        scene.on_start();

        SceneManager {
            scenes: vec![Box::new(scene)]
        }
    }

    fn update_children(&mut self) {
        for mut scene in &mut self.scenes {
            scene.update();
        }
    }
    ...

    fn get_children(&self) -> Vec<Box<Scene>> {
        return self.scenes
    }

    ...
}

#[cfg(test)]
mod tests {
    use super::*;

    struct Sample {
        running: bool
    }

    impl Scene for Sample {
        fn update(&mut self) {
            if self.running {
                self.stop()
            }
        }

        fn stop(&mut self) {
            self.running = false;
        }

        fn is_active(&self) -> bool { self.running }
    }

    ...

    #[test]
    fn test_no_scene_is_running() {
        let mut scene_manager = SceneManager::new(Sample{running: true});
        scene_manager.update_children();
        let children = scene_manager.get_children();
        for mut scenes in children {
            assert!(!scene.is_active());
        }
    }
}

问题:

error[E0507]: cannot move out of borrowed content
  --> src/main.rs:12:9
   |
12 |         self.scenes
   |         ^^^^ cannot move out of borrowed content

我们已经看过一百万次了。大多数答案都说使用&self代替self。那就是我在这里做的事情。即使&mut self也不起作用,虽然我没有在这里做任何改变,所以不需要。

请赐教我,并指出解释我怎么做不到的文档。

1 个答案:

答案 0 :(得分:1)

您的.clients = ( .clients | [max|twopowers_v3] as $powers | map(base2powers_v2($powers)) | transpose | map(max) | add ) 相当于

fn get_children(&self)

你可以像

一样调用这个函数
fn get_children(&self) -> Vec<Box<Scene>> {
    return self.scenes;
}

这有效地将let children = scene_manager.get_children(); 变量移动到self.scenes;

您使用参数children调用了函数get_children,因此变量(&self)被借用到函数中,之后您尝试从函数内部返回(或移动)一个值struct,这是编译器抱怨的。