gpt4 book ai didi

Rust 借用语义字符串

转载 作者:行者123 更新时间:2023-11-29 08:16:02 24 4
gpt4 key购买 nike

我有一段代码

let mut current_room = None;

for (ref room_id, ref poker_room) in &self.planning_pokers {
if poker_room.has_player(user_id.clone()) {
current_room = Some(room_id.clone());
break
}
}

match current_room {
Some(room_id) => {
self.planning_pokers.get_mut(&room_id.clone()).unwrap().remove_player(user_id.clone());
if self.planning_pokers.is_empty() {
self.planning_pokers.remove(&room_id.clone());
}
},
None => (),
_ => ()
}

println!("Player {} joined room {}", join_room.room_id.clone(), user_id.clone());
if self.planning_pokers.contains_key(&join_room.room_id.clone()) {

}

由于可变和不可变借用冲突,编译失败。所讨论的冲突与我将 current_room 的值设置为 Some(room_id.clone()) 有关。如果我改为执行 Some(room_id.clone().to_string()) 一切都会按预期进行。为什么会这样?为什么 Rust 编译器会给我一个看似无关的错误?

供引用,这是错误:

cannot borrow self.planning_pokers as mutable because it is also borrowed as immutable

最佳答案

看起来像room_id&&T 类型的双重引用.这意味着在 Some(room_id.clone()) ,您正在克隆对数据的借用引用 self.planning_pokers拥有,而不是克隆底层数据本身。因为您随后将其分配给变量 current_room在外部范围内,self.planning_pokers始终是借来的。在这种情况下,可能会有所帮助,current_room类型为 Option<&T> .

Some(room_id.to_string())而是创建一个移动到 current_room 中的基础数据的副本.在这种情况下 current_room类型为 Option<T> .

差异是(我相信)由于 Rust 的 auto-dereferencing behaviour .不可变引用实现 Clone , 所以 Rust 在 &T 上调用方法.但是,他们没有实现 ToString , 所以 Rust 一直取消引用到 T .


备注:rust-clippy警告这个问题。来自wiki :

clone_double_ref

它的作用:检查 .clone() 在 &&T 上的使用情况。

为什么这样不好?克隆 &&T 会复制内部 &T,而不是克隆底层 T。

示例:

fn main() {
let x = vec![1];
let y = &&x;
let z = y.clone();
println!("{:p} {:p}",*y, z); // prints out the same pointer
}

关于Rust 借用语义字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48913089/

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