Rust 的核心功能-所有权(ownership)

什么是所有权

  Rust要核心功能之一是所有权(ownership)。虽然该功能很容量解释,但它对语言的其它部分有着深刻的影响。

  所有运行的程序都必顺管理其使用计算机内存的方式。一些语言中具有垃圾回收机制,在程序运行时不断地寻找不再使用的内存;在另一些语言中,程序员必顺亲自分配和释放内存。Rust则选择了第三种的方式:通过所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查。在运行时,所有权系统的任何功能都不会减慢程序。

  因为所有权对很多程序员来说都是一个新概念,需要一些时间来适应。好消息是随着你对Rust和所有权系统的规则越来越有经验,你就越能自然地编写出安全和高效的代码。持之以恒!

  当我们理解了所有权,就将有一个坚实的基础来理解那些使Rust独特功能。

栈(Stack)与堆(Heap)

  在很多语言中,我们并不需要经常考虑到stack和heap。不过在像Rust这样的系统编程语言中,值是位于栈上还是堆上在更大程度上影响了语言的行为以及为何必顺做出这样的抉择。

  跟踪哪部分代码正在使用堆上的哪些数据,最大限度的减少堆上的重复数据的数量,以及清理堆上不再使用的数据确保不会耗尽空间,这些问题正是所有权系统要处理的。一旦理解了所有权,你就不需要经常考虑栈和堆了,不过明白了所有权的存在就是为了管理堆数据,能够帮助解释为什么所有权要以这种方式工作。

所有权规则

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

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

所有权与函数

  将值传递给函数在语义上与给变量赋值相似。向函数传递值可能会移动或者复制,就像赋值语句一样。

转移返回值的所有权

  变量的所有权总是遵循相同的模式:将值赋给另一个变量时移动它。当持有堆中数据值的变量离开作用域时,其值将通过drop被清理掉,除非数据被移动为另一个变量所有。

  在每一个函数中都获取所权并接着返回所有权有些罗嗦。如果我们想要函数使用一个值但不获取所有权该怎么办呢?如果我们还要接着使用它的话,每次都传进去再返回来就有点麻烦人了,除此之外,我们也可能想返回函数体中产生的一些数据。我们可以使用元组来反回多个值。

返回参数的所有权:

fn main() {
    let s1 = String::from("test");
    let (s2, l) = calculateLen(s1);
    println!("s:{},l:{}",s2,l) 
}

fn calculateLen(s: String) -> (String, usize) {
    let l = s.len();
    (s, l)
}

但是这未免有些形式主义,而且这种场景应该很常见。幸运的是,Rust对比提供了一个功能,叫做引用(references)。

深入学习

原文地址:https://www.cnblogs.com/johnnyzhao/p/14449794.html