Rust

Rust 还有一种名为引用(reference)的非拥有型指针,这种指针对引用目标的生命周期毫无影响。

引用的生命周期绝不能超出其引用目标。你的代码必须遵循这样的规则,即任何引用的生命周期都不可能超出它指向的值。为了强调这一点,Rust 把创建对某个值的引用的操作称为借用(borrow)那个值:凡是借用,终须归还

对值的引用

通过前面的内容我们已经知道,当变量交给程序后程序就将不可用.

例子 1

fn main() {
    let name: String = "Rust".to_string();
    show(name);
    println!("Hello, {}", name); //在此处就将出现异常
}

fn show(name: String) {
    println!("Hello, {}", name);
}

那我们就想做一个简单打印且不影响我后面的调用呢? 那么我们就可以使用 引用

引用 分为 不可变引用可变引用 &T &mut T 那么上面的例子我们改为以下我们就可以正常使用了.

fn main() {
    let name: String = "Rust".to_string();
    show(&name);
    println!("Hello, {}", name);
}

fn show(name: &String) {
    println!("Hello, {}", name);
}

使用引用

如果需要使用引用的值那么我们需要在 对象前面 添加上 * 为什么在使用 show 时不需要添加,因为我们在 .show已经隐式的帮我们添加了

例子 1 不可变引用

// 从这里开始回到Rust代码
let x = 10;
let r = &x;            // &x是对x的共享引用
assert!(*r == 10);     // 对r显式解引用

例子 2 可变引用

let mut y = 32;
let m = &mut y;        // &muty是对y的可变引用
*m += 32;              // 对m显式解引用,以设置y的值
assert!(*m == 64);     // 来看看y的新值

例子 3 对引用变量进行赋值

let x = 10;
let y = 20;
let mut r = &x;

if b { r = &y; }

assert!(*r == 10 || *r == 20);

例子 4 对引用再引用

let x = 10;
let y = 20;
let mut r = &x;
if b { r = &y; }
assert!(*r == 10 || *r == 20);

例子 5比较引用

let x = 10;
let y = 10;

let rx = &x;
let ry = &y;

let rrx = ℞
let rry = &ry;

assert!(rrx <= rry);
assert!(rrx == rry);

[!IMPORTANT]

引用永不为空

Rust 允许借用任意种类的表达式结果值的引用

fn factorial(n: usize) -> usize {
    (1..n+1).product()
}
let r = &factorial(6);
// 数学运算符可以“看穿”一层引用
assert_eq!(r + &1009, 1729);

引用安全

例子 1 不能借用对局部变量的引用并将其移出变量的作用域

{
    let r;
    {
        let x = 1;
        r = &x;
    }
    assert_eq!(*r, 1);  // 错误:试图读取`x`所占用的内存
}