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
}