pub struct Character {
    name: String,
    hp: i32,
    level: i32,
    xp: i32,
    xp_needed: i32,
    gold: i32
}

impl Character {
    pub fn new(name: String) -> Character {
        let mut rng = thread_rng();

        let hp: i32 = rng.gen_range(12, 75);
        let gold: i32 = rng.gen_range(10, 50);

        Character { name: name, hp: hp, level: 1, xp: 0, gold: gold, xp_needed: 100 }
    }

    pub fn get_name(&self) -> String {
        self.name
    }

    // ...
}

我到底是怎么违反规则的?



嗯,不是吗?我还有其他功能,例如:
pub fn get_hp(&self) -> i32 {
    self.hp
}

这工作得很好。

   |
23 |         self.name
   |         ^^^^ cannot move out of borrowed content

error: aborting due to previous error

这是怎么回事?返回字符名称的适当方法是什么?为什么 get_hp 方法有效,但 get_name 方法无效?

最佳答案

get_hpget_name 之间的区别在于 get_hp 返回一个 i32i32 Copy 类型。 Copy 类型可以通过简单地复制位来复制并且永远不会移出。另一方面 String 不是 Copy ,它管理一些必须转移(移出)或 Clone d 的内存。

对于这样的 getter,返回引用而不是克隆更为惯用。而对于 String s,它应该特别是 be &str

pub fn get_name(&self) -> &str {
    &self.name
}

10-08 00:40