考虑以下结构:
pub struct Character {
pub name: String
}
pub fn build_character(name: String) -> Character {
Character {
name,
}
}
还没有什么复杂的,所以现在我们已经通过向build_character
传递字符串名称来构建了一个字符,我们将这个结构传递给一个新函数:
pub fn create_game(character: Character) -> Game {
Game {
active: true,
game_character: character,
}
}
游戏内容定义如下:
pub struct Game {
active: bool,
game_character: Character,
}
impl Game {
pub fn is_active(&self) -> bool {
return self.active;
}
pub fn set_acive(&mut self, active: bool) {
self.active = active;
}
pub fn get_character(&self) -> Character {
return self.game_character;
}
pub fn update_character(&mut self, character: Character) {
self.game_character = character;
}
}
这就是我们的问题所在。
error[E0507]: cannot move out of `self.game_character` which is behind a shared reference
--> game/src/game/set_up_game.rs:19:16
|
19 | return self.game_character;
| ^^^^^^^^^^^^^^^^^^^ move occurs because `self.game_character` has type `character::character::charactersheet::Character`, which does not implement the `Copy` trait
功能中:
pub fn get_character(&self) -> Character {
return self.game_character;
}
这是有道理的。但众所周知,我们不能将复制特性添加到字符结构中,因为字符串是不能复制的,它们是指向内存的指针。我试过克隆,但也不起作用,我得到了同样的错误。
(根据错误,克隆和复制用于Character结构(。
这里的想法是,游戏对象被传递给我,让我可以更新角色,思考库存、法术、健康等等。
我会获取游戏对象获取角色,更新角色,然后将角色设置回游戏对象。
所以我的问题是我们如何解决这个问题?
可能性1:为Character
实现/派生Clone
并返回克隆:
#[derive(Clone)]
pub struct Character {
pub name: String
}
pub struct Game {
active: bool,
game_character: Character,
}
impl Game {
// possibility 1
pub fn get_character(&self) -> Character {
return self.game_character.clone();
}
}
可能性2:返回参考。
#[derive(Clone)]
pub struct Character {
pub name: String
}
pub struct Game {
active: bool,
game_character: Character,
}
impl Game {
pub fn get_character(&self) -> &Character {
return &self.game_character;
}
}
可能性2(返回引用(的优点是它很便宜,调用方可以自己决定是否真的需要一个副本,在这种情况下,调用方只需手动clone
即可。