跳至主要內容

rust基础笔记

Mr.Lexon大约 3 分钟rust

Rust基础笔记

所有权

rust区别于其他编程语言来说,它新增了一个概念叫所有权,就是变量的移动是有所有权概念的,什么意思呢,如下代码:

let a = 10;
let b = a;
foo(a)

在以上代码中,变量a的所有权被b获取了,所以当foo对此进行调用的时候,就会报错,这就引出来所有权第一个概念:每个值有唯一的所有者,而这里的ab获取了所有权了,此时的a定义的值就被转移到了b,所以foo在获取a的时候发现a已经给回收了。

let a = 10;
foo(a);
hello(a);

在这一段代码中,变量a的所有权被foo消费掉了,所以当hello对此进行调用的时候,就会报错,因为hello在获取a的时候发现a已经给回收了,这就引出来所有权第二个概念:所有权可转移,这里的afoo获取了所有权了,hello再尝试获取就有问题了。 综合这两段代码,发现每当所有权被转移的时候会发现原来的变量都会被回收,这就引出来第三个概念:值离开作用域就会被回收,其中所有权被转移就是值的作用域被转移了。所以对应的值也就会被回收了。那么如何才能多次使用变量呢?那么就要使用下面两个概念:CloneReference

Clone

Clone顾名思义,就是将值复制一份用于消费,这个前提是对应的变量的类型要实现Clone这个trait,如下例子:

#[dervice(Clone)]
struct A;

let a = A;
foo(a.clone());
hello(a);

这样就可以将同一个变量里面的值通过Clone使用多次.

Reference

Reference指的是将变量借用,不转移所有权,如下例子:

struct A;

let a = A;
foo(&a);
hello(&a);

这个例子中,a的作用域是不变的,一直在这个上下文内,foohello是借用a的,不过这里有个前提,就是这个foohello形参都是类型都是&A而不是A。这两的区别是一个是借用,而另一个要求的是所有权。

由于上面举得例子基本都是不可更改的(immutable)这是rust基本规则,就是变量未特殊声明均为不可更改的。那么在可更改下(mutable)的引用是怎么样的,可以看这个例子:


let mut s = String::from("hello");
let r1 = &mut s;
// let r2 = &mut s;             // 错误!同一时间只能有一个可变引用
r1.push_str(" world");
println!("{}", s); 

从这个例子可以得出,可变引用在一个作用域,同一时间内只能有一个,多个可使用RefCell<T>,这里先按下不表。

生命周期

生命周期是rust第二个关键的概念,他的核心是确保变量在引用时,存活足够长的时间。例如:

fn invalid_ref() -> &str {
    let s = String::from("error");
    &s
}

在这个例子中s在函数调用完成时被销毁了,那么&s也是无效的。所以在这里需要延长它的生命周期,或者将其所有权返回出去。

泛型

rust的泛型可以同类型和不同类型定义,然后可以通过特征约束泛型类型。rust的泛型是单态化的,好处是运行性能会有很大提升,因为直接在编译期就解决了所有泛型可能出现的情况,没有运行时开销,缺点是编译时间较长,并且代码体积容易膨胀。