在Rust中无法移出借用内容

5
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方法无效?


6
同一个错误信息有很多其他问题需要解决。i32 是可复制的,但 String 不是。你没有拥有 self,它被借用了(&self)。 - Shepmaster
3
@Shepmaster 这并没有回答我的问题或给我一个解决方案。 - TheWebs
3
@Shepmaster的意思是,你应该在问题中展示一些努力,如果有其他类似的问题,请解释为什么它们的答案不适用于你的问题。请注意保持原文意思,让翻译更易于理解,不要添加解释或其他内容。 - mcarton
1个回答

13

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

对于这样的getter,更符合惯用法的是返回引用而不是克隆。对于String,应该具体使用 &str

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接