此页内容

引用与借用

鹏展博

353字约1分钟

2022-06-03

借用

借用(borrowing) 是指,获取变量的引用。

引用与解引用

在Rust中,通过 & 进行引用, 通过 * 进行解引用。

fn main() {
  let x = 5;
  let y = &x; // 此时 y 是一个 引用

  assert_eq!(5, x);
  // 对引用类型进行解引用运算,访问y所指向的整数类型
  // 如果不进行解引用,则会得到编译错误
  assert_eq!(5, *y);
}

不可变引用

不可变引用 仅允许使用值,但不获取所有权。

当引用离开作用域后,其指向的值也不会被丢弃。

fn main() {
  let s1 = String::from("aa");

  let len = get_str_len(&s1);

  println!("the length of '{}' is {}", s1, len);
}

fn get_str_len(s: &String) -> usize {
  s.len()
} // 在这里 s 离开了作用域,但它不拥有引用值的所有权,所以什么也不会发生

可变引用

可变引用通过 &mut 声明:

fn main() {
  let mut s = String::from("hello"); // 创建一个可变字符串

  change_str(&mut s); // 传入一个可变引用

  println!("{}", s);
}

fn change_str(s: &mut String) { // s 是一个 可变引用
  s.push_str(", world"); // 插入新的字符串切片
}
  • 同一个作用域,特定数据只能有一个可变引用
  • 同一个值的可变引用和不可变引用不可以同时存在
  • 引用必须总是有效的 (即不能引用已经被释放的值)