是的我有read the docs,三次。
我看过:Cannot move out of borrowed content in Rust和Cannot 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
也不起作用,虽然我没有在这里做任何改变,所以不需要。
请赐教我,并指出解释我怎么做不到的文档。
答案 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,这是编译器抱怨的。