引用

  • &:引用符号,允许使用值,但是不获取所有权
  • *:解引用符号
fn main() {
    let x = 5;
    let y = &x;
    assert_eq!(5, x);
    assert_eq!(5, *y);
}
fn main() {
    let s1 = String::from("hello");
    let len = calculate_length(&s1);
    println!("The lenght of '{}' is {}.", s1, len);
}
 
fn calculate_length(s: &String) -> usize {
    s.len()
}

不可变引用

一般情况下,不能修改引用值:

fn main() {
    let s = String::from("hello");
    change(&s);
}
 
fn change(some_string: &String) {
    // ERROR!
    some_string.push_str(", world");
} 

可变引用

要修改值,需使用可变引用:

fn main() {
    let s = String::from("hello");
    change(&mut s);
}
 
fn change(some_string: &mut String) {
    // Correct!
    some_string.push_str(", world");
} 
  • 同一作用域,特定数据只能有一个可变引用!
  • 可变引用与不可变引用不能同时存在!

在使用 &mut 引用原变量,到 &mut 被释放前,无法修改原变量:

fn main() {
    let mut x = 1;
    let y = &mut x;
    // 报错!
    x = 2;
    *y = 3;
}

以上代码无法通过编译,执行到x = 2时,变量的所有权还在y上。该关键字的英文为borrowing,从英文理解更加简单一些,国内也有将其翻译为借用。