Rust 锈蚀借用语义字符串
我有一段代码Rust 锈蚀借用语义字符串,rust,Rust,我有一段代码 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(r
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\u room
的值设置为Some(room\u id.clone())
有关。如果我改为Some(room\u id.clone().to\u string())
一切正常。为什么会这样?为什么rust编译器会给我一个看似无关的错误
以下是错误,仅供参考:
不能借用self。规划扑克作为可变的,因为它也是作为不可变的借用
看起来room\u id
是类型和&T
的双重引用。这意味着在Some(room_id.clone())
中,您正在克隆对self.planning\u poker
拥有的数据的借用引用,而不是克隆基础数据本身。由于随后将其分配给外部范围中的变量current\u room
,self.planning\u poker
始终处于借用状态。在这种情况下,current\u room
的类型为Option
,这可能会有所帮助
Some(room\u id.to\u string())
创建基础数据的副本,然后将其移动到当前的\u room
。在这种情况下,当前\u房间
属于选项
类型
(我相信)这种差异是由于生锈造成的。不可变引用实现克隆
,因此Rust在&T
上调用该方法。但是,它们没有实现到字符串
,因此会一直到T
注意:警告此问题。从:
克隆双参考
它的作用:检查.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
}