< 返回版块

tch1121 发表于 2024-02-07 14:19

cargo add curl

use curl::easy::Easy;

fn main() {
  let mut dst = Vec::new();
  let mut easy = Easy::new();
  // {
  easy.url("https://www.rust-lang.org/").unwrap();
  let mut transfer = easy.transfer();
  transfer
    .write_function(|data| {
      dst.extend_from_slice(data);
      Ok(data.len())
    })
    .unwrap();
  transfer.perform().unwrap();
  // }

  println!("{:?}", dst);
}

错误信息

10 |     .write_function(|data| {
   |                     ------ mutable borrow occurs here
11 |       dst.extend_from_slice(data);
   |       --- first borrow occurs due to use of `dst` in closure
...
18 |   println!("{:?}", dst);
   |                    ^^^ immutable borrow occurs here
19 | }

如果我把{}解开注释就能编译通过,这是为什么

评论区

写评论
作者 tch1121 2024-02-07 14:55

原来如此, 学到了

--
👇
Bai-Jinlin: 因为Transfer实现了Drop,在println之后才出作用域,write_function代码是这样

    pub fn write_function<F>(&mut self, f: F) -> Result<(), Error>
    where
        F: FnMut(&[u8]) -> Result<usize, WriteError> + 'data,
    {
        self.data.write = Some(Box::new(f));
        Ok(())
    }

相当于transfer变量内含有dst的可变引用,所以在drop transfer之前不能使用dst,解决方法你也知道,要么开个scope,要么在println之前调用core::mem::drop(transfer)。

Bai-Jinlin 2024-02-07 14:38

因为Transfer实现了Drop,在println之后才出作用域,write_function代码是这样

    pub fn write_function<F>(&mut self, f: F) -> Result<(), Error>
    where
        F: FnMut(&[u8]) -> Result<usize, WriteError> + 'data,
    {
        self.data.write = Some(Box::new(f));
        Ok(())
    }

相当于transfer变量内含有dst的可变引用,所以在drop transfer之前不能使用dst,解决方法你也知道,要么开个scope,要么在println之前调用core::mem::drop(transfer)。

bestgopher 2024-02-07 14:33

transfer应该是借用了dst的可变借用,因此你没有{}的时候,transfer没有被释放,所以一直持有dst的可变借用,因此println!无法再借用dst的不可变借用。猜的。

1 共 3 条评论, 1 页