【问题标题】:cannot borrow `*self` as mutable more than once at a time一次不能多次借用 `*self` 作为 mutable
【发布时间】:2018-07-06 11:16:09
【问题描述】:

我不明白这个借用检查器错误:

pub fn wait_for_device(&mut self) -> RoxResult<hidapi::HidDevice> {
    let mut device = self.open_device();
    let start = time::Instant::now();
    while device.is_err() {
        device = self.open_device();
        if start.elapsed().as_secs() > 30 {
            return Err("Can't reconnect to device".to_owned());
        }
    }
    Ok(device.expect("Out of while so we should have a device"))
}

pub fn open_device(&mut self) -> RoxResult<hidapi::HidDevice> {
    let device_info = &self.list[0]; 
    if let Ok(device) = self.api.open(device_info.vendor_id, device_info.product_id) {
        self.current_device = Some(device_info.clone());
        Ok(device)
    } else {
        Err(format!(
            "Error opening device vip: {:x} pid: {:x}",
            device_info.vendor_id, device_info.product_id
        ))
    }
}

error[E0499]: cannot borrow `*self` as mutable more than once at a time
  --> src\usb.rs:64:22
   |
61 |         let mut device = self.open_device();
   |                          ---- first mutable borrow occurs here
...
64 |             device = self.open_device();
   |                      ^^^^ second mutable borrow occurs here
...
70 |     }
   |     - first borrow ends here

我以为我的第一次借款将在open_device 结束时结束,但似乎我错了。为什么?

【问题讨论】:

标签: rust


【解决方案1】:

变量在声明它们的范围结束之前一直有效。您创建了一个变量device,并在整个函数的范围内为其分配了借来的值。换句话说,借用在函数的末尾结束(正如您在编译器错误消息中看到的那样)。

【讨论】:

  • 我不明白,编译器抱怨的是self,而不是device
  • 因为问题不在于device 本身,而在于您在同一范围内可变地借用了两次self
  • 那么我们如何在 Rust 中编写这个?只要我没有 HidDevice,我就想继续尝试 open_device :-/
  • 知道了,HidDevice 有生命周期并且没有克隆(这对管理 USB 连接很有意义),如果有机会丢失它,我无法保留它。我只会在发送/接收数据时调用open_device,让设备Drop。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
  • 2023-02-24
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多