无法用字符串复制结构,那么我该如何解决这个问题



考虑以下结构:

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即可。

最新更新