1. fn main() {
  2. let s1 = String::from("hello");
  3. let len = calculate_length(&s1);
  4. println!("The length of '{}' is {}.", s1, len);
  5. }
  6. fn calculate_length(s: &String) -> usize {
  7. s.len()
  8. }

这些 & 符号就是 引用,它们允许你使用值但不获取其所有权。

引用(reference)与借用(borrow) - 图1

我们将获取引用作为函数参数称为 借用borrowing

  1. fn main() {
  2. let mut s = String::from("hello");
  3. // 可变引用 &mut
  4. change(&mut s);
  5. }
  6. fn change(some_string: &mut String) {
  7. some_string.push_str(", world");
  8. }


引用的规则

  • 在任意给定时间,要么 只能有一个可变引用,要么 只能有多个不可变引用。
  • 引用必须总是有效的。
  1. let mut s = String::from("hello");
  2. let r1 = &s;
  3. let r2 = &s; // 不可变没问题
  4. println!("{} and {}", r1, r2);
  5. // 此位置后 r1 r2 已归还引用
  6. let r3 = &mut s; // 没问题
  7. println!("{}", r3);
  1. let mut s = String::from("hello");
  2. let r1 = &s; // 没问题
  3. let r2 = &s; // 没问题
  4. let r3 = &mut s; // 已有多个不可变引用 不能再有可变引用
  5. println!("{}, {}, and {}", r1, r2, r3);
  1. let mut v = vec![1, 2, 3, 4, 5];
  2. let third = &v[0];
  3. v.push(6);
  4. println!("third is {}", third);