Skip to content

对一个问题的粗浅理解

// Buggy code
fn main() {
    let mut v = String::from("hello,");
    let r = &mut v;

    match r {
       ref mut value => value.push_str(" world!") 
    }
    // println!("{}", r);
}

如图,这一段代码是通不过的。具体原因很复杂,暂且不讨论。

Code 1

下面的代码是可以通过的:

fn main() {
    let mut v = String::from("hello,");
    let r = &mut v;

    match r {
       value => value.push_str(" world!") 
    }
    // println!("{}", r);
}

但是,这一段代码的问题:

  • v 把所有权借给了 r
  • r 把所有权交给了 value,同时 v 的所有权也转借给了 value
  • value 通过 v 的所有权,对 v 进行修改
  • value 在作用域外析构,并且将 v 的所有权还给 v(因为是借的),但是 r 的所有权就丢弃了(因为是 r 交给它的)

因此,如果加上 println!("{}", r),就会报错。

Code 2

下面的代码是可以通过的(注意 \(r\) 仍然有效):

fn main() {
    let mut v = String::from("hello,");
    let r = &mut v;

    match *r {
       ref mut value => value.push_str(" world!") 
    }
    println!("{}", r);
}
  • v 把所有权的借给了 r
  • 由于 ref mut value = *r,因此 r 把 *r 给了出去,具体地,就是把 v 转借给了 value,但是 r 的所有权还在 r 手上

Disclaimer

这只是我的粗浅解释。目前,Rust 的一些细节之处还很恶心,经常会发生变化。所以我只是通过几个小案例,总结出了自己的一家之词,实际情况肯定复杂地多。 - 可以看这个解释: Rust 圣经 - 评论区