首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法移出借来的内容和生成器模式

无法移出借来的内容和生成器模式
EN

Stack Overflow用户
提问于 2015-08-06 14:58:12
回答 1查看 1.2K关注 0票数 6

我只是在学锈病。我正在尝试为我的游戏结构创建一个构建器结构。以下是代码:

代码语言:javascript
复制
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中抱怨如下:

代码语言:javascript
复制
error: cannot move out of borrowed content

我想我明白原因了。因为函数中传递的参数是&self,所以我不能获得它的所有权,这就是最后一行要做的事情。

我认为可能将&self更改为self是可行的,但是编译认为我不能改变self

据我所知,也有复制的特点,这也许能解决问题。但是输入基本上是一个HashMap,这意味着如果散列本身太大,复制可能会很昂贵。

怎样才能解决这个问题呢?

编辑:

我试过这样做:

代码语言:javascript
复制
#[derive(Debug, Copy, Clone)]
struct Input {
    keys_pressed: HashMap<VirtualKeyCode, bool>,
}

但是编译器抱怨:

代码语言:javascript
复制
error: the trait `Copy` may not be implemented for this type; field `keys_pressed` does not implement `Copy`
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-06 15:07:37

考虑到您的方法签名是如何形成的,您的目标似乎是链接:

代码语言:javascript
复制
let game = GameBuilder::new().with_dimensions(...)
                             .with_title(...)
                             .build();

在Rust中,这要求通过值传递GameBuilder

代码语言:javascript
复制
pub fn with_dimensions(self, ...) -> GameBuilder {
    // ...
}

为了能够在方法中变异self,您需要使它成为mut

代码语言:javascript
复制
pub fn with_dimensions(mut self, ...) -> GameBuilder {
}

如果您将with_dimensionswith_titlegame_keysbuild的签名更改为按值取self (如果要进行突变,则为mut self),那么链接应该有效。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31859154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档