4.2 引用与借用

原文链接:https://kaisery.github.io/trpl-zh-cn/ch04-02-references-and-borrowing.html

以一个对象的引用作为参数而不是获取值的所有权:

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

    let len = calculate_length(&s1);

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

fn calculate_length(s: &String) -> usize {
    s.len()
}

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

图 4-5:&String s 指向 String s1 示意图

&s1 语法让我们创建一个 指向 值 s1 的引用,但是并不拥有它。因为并不拥有这个值,当引用离开作用域时其指向的值也不会被丢弃。

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

变量 s 有效的作用域与函数参数的作用域一样,不过当引用离开作用域后并不丢弃它指向的数据,因为我们没有所有权。当函数使用引用而不是实际值作为参数,无需返回值来交还所有权,因为就不曾拥有所有权。

我们将获取引用作为函数参数称为 借用(borrowing)。正如现实生活中,如果一个人拥有某样东西,你可以从他那里借来。当你使用完毕,必须还回去。

引用的规则

  1. 在任意给定时间,要么 只能有一个可变引用,要么 只能有多个不可变引用
  2. 引用必须总是有效。

我们来看看另一种不同类型的引用:slice。

你可能感兴趣的:(4.2 引用与借用)