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(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/

相关文章:

google-sheets - 如何使用google_sheets4条板箱构造适当的values_update调用?

rust - 如何在 Rust 中解构和取消引用元组

Rust Actix:为 System::current() 获取 SystemRunner

if-statement - 为什么我们不在if/else的末尾加一个分号(;)呢?

rust - 防止文档测试中的换行

error-handling - 是否有将错误转换为 panic 的宏?

rust - 如何根据 structopt 中另一个参数的存在使参数可选?

list - 如何修改列表中的结构项?

rust - 如何从底物中的子树中获取根哈希或证明?

Rust Diesel 更新连接表