我只是在学锈病。我正在尝试为我的游戏结构创建一个构建器结构。以下是代码:
struct Input {
keys_pressed: HashMap<VirtualKeyCode, bool>,
}
pub struct GameBuilder {
settings: GameSettings,
input: Input,
}
impl GameBuilder {
pub fn new() -> GameBuilder {
GameBuilder {
settings: GameSettings {
window_dimensions: (800, 600),
title: "".to_string(),
},
input: Input {
keys_pressed: HashMap::new(),
}
}
}
pub fn with_dimensions(&mut self, width: u32, height: u32) -> &mut GameBuilder {
self.settings.window_dimensions = (width, height);
self
}
pub fn with_title(&mut self, title: &str) -> &mut GameBuilder {
self.settings.title = title.to_string();
self
}
pub fn game_keys(&mut self, keys: Vec<VirtualKeyCode>) -> &mut GameBuilder {
for key in keys {
self.input.keys_pressed.insert(key, false);
}
self
}
pub fn build(&self) -> Game {
let (width, height) = self.settings.window_dimensions;
Game {
display: glutin::WindowBuilder::new()
.with_dimensions(width, height)
.with_title(self.settings.title.to_string())
.build_glium()
.ok()
.expect("Error in WindowBuilder"),
state: GameState::Running,
input: self.input,
}
}
}但是,这段代码在最后一行input: self.input中抱怨如下:
error: cannot move out of borrowed content我想我明白原因了。因为函数中传递的参数是&self,所以我不能获得它的所有权,这就是最后一行要做的事情。
我认为可能将&self更改为self是可行的,但是编译认为我不能改变self。
据我所知,也有复制的特点,这也许能解决问题。但是输入基本上是一个HashMap,这意味着如果散列本身太大,复制可能会很昂贵。
怎样才能解决这个问题呢?
编辑:
我试过这样做:
#[derive(Debug, Copy, Clone)]
struct Input {
keys_pressed: HashMap<VirtualKeyCode, bool>,
}但是编译器抱怨:
error: the trait `Copy` may not be implemented for this type; field `keys_pressed` does not implement `Copy`发布于 2015-08-06 15:07:37
考虑到您的方法签名是如何形成的,您的目标似乎是链接:
let game = GameBuilder::new().with_dimensions(...)
.with_title(...)
.build();在Rust中,这要求通过值传递GameBuilder:
pub fn with_dimensions(self, ...) -> GameBuilder {
// ...
}为了能够在方法中变异self,您需要使它成为mut。
pub fn with_dimensions(mut self, ...) -> GameBuilder {
}如果您将with_dimensions、with_title、game_keys和build的签名更改为按值取self (如果要进行突变,则为mut self),那么链接应该有效。
https://stackoverflow.com/questions/31859154
复制相似问题