无法移出 Rust 中借用的内容

2023-12-14

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?


和...之间的不同get_hp and get_name就是它get_hp返回一个i32. i32 is a Copy type. Copy类型可以通过简单地复制位来复制,并且永远不会被移出。另一方面String is not Copy,它管理一些必须转移(移出)或Cloned.

对于像这样的 getter,返回引用而不是克隆更为惯用。而对于Strings,应该具体.

pub fn get_name(&self) -> &str {
    &self.name
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法移出 Rust 中借用的内容 的相关文章

随机推荐