无法摆脱Rust中的借来的内容

时间:2016-10-16 20:19:17

标签: rust

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
    }

    // ...
}

我在这里如何违反规定?

  

在高级别,这对Rust来说是违规的。

,你不能转让借来的东西的所有权。

不,我不是吗?我还有其他功能:

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无效?

1 个答案:

答案 0 :(得分:11)

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

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

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