gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:52:09 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com