通过这篇文章,我们将来学习Rust 最独特的特性—— 所有权

# 所有权规则

首先,让我们看一下所有权的规则。当我们通过举例说明时,请谨记这些规则:

  1. Rust 中的每一个值都有一个被称为其 所有者(owner)的变量。
  2. 值在任一时刻有且只有一个所有者。
  3. 当所有者(变量)离开作用域,这个值将被丢弃。

# 引用与借用

在 Rust 中,如果我们想使用一个变量的值,但又不想获取它的所有权,我们可以使用 引用(Reference)。

如果我们需要在函数中使用一个值但不获取所有权,通常的做法可能需要将所有权传进去再传出来,但是这样的做法太繁琐了。因此在 Rust 中,我们可以通过引用代替这种将所有权传来传去的写法。

fn get_string_length(s: &String) -> usize {
    let length = s.len();
    return length;
}

fn main() {
    let s = String::from("hello");
    let length = get_string_length(&s);
}

在这种写法中,我们并没有传递 s 的所有权,而是通过 & 符号声明我们传递的是一个 s 的引用,而不取得它的所有权。

# 可变引用

但是在这里,我们是没有办法通过这个引用去修改 s 的值的。如果需要修改它的值,我们需要将这个引用声明为 可变引用。

fn append_string(s: &mut String, string: &str) {
    s.push_str(string);
}

fn main() {
    let mut s = String::from("hello");
    append_string(&mut s, ", world");
    println!("{}", s); // hello, world
}

# 可变引用的限制

可变引用有一个重要的限制:在特定的作用域内,对某一块数据,只能有最多一个的可变引用。 这样设计的好处是在编译时就可以防止数据竞争。
另外,Rust 也不允许同时存在一个可变引用和不可变引用。

# 总结

所有权系统是 Rust 保证内存安全的关键机制,通过理解所有权、借用和引用的规则,我们可以在无需垃圾回收的情况下编写出安全且高效的代码。