rust - 无法移出 Rust 中的借用内容

标签 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
    }

    // ...
}

我究竟是如何违反规则的?

At a high-level, this is against-the-grain for Rust. You cannot transfer ownership of something borrowed because you don't own it.

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

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 返回一个i32i32Copy类型。 Copy 类型可以通过简单地复制位来复制,并且永远不会被移出。另一方面,String 不是Copy,它管理一些必须传输(移出)或Cloned 的内存。 .

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

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

关于rust - 无法移出 Rust 中的借用内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40075031/

相关文章:

rust - 在宏中调用 `stringify!`

rust - 如何模仿效用函数的可变参数?

rust - 反转字符串的一部分

rust - 如何在 Rust 中拒绝没有显式类型注释的 int 变量?

rust - 在 Windows x64 上安装 Rust 时出错

struct - 调用带 `self`的方法时不修改数据结构

rust - 为什么我在子模块中需要 `use` 语句而不是在 main.rs 中?

rust - 如何声明在借用项上提供迭代器的特征并在函数参数中使用它?

rust - 如何在结构中具有可重用的Vec <RwLockReadGuard>以避免分配?

pattern-matching - 这个解包/模式匹配代码可以更清晰/惯用吗?