rust 教程 03 引用

这篇博客我们主要讨论non-owning的指针类型: ref。注意一个核心点,ref的lifetime不能超过借用的那个值;我们将看到ref, func, 以及用户自定义类型是如何利用lifetime使得ref的使用是安全的。

ref to values

有两种类型的ref:

  • shared:&T,注意共享的引用本身是Copy类型
  • 可变引用: &mut T,不是copy类型

可以看下面的例子:

fn show(table: &Table) {
    for (artist, works) in table {
        for work in works {
            println!(" {}", work);
        }
    }
}

注意这里的table是引用,导致其内部的值也都变成引用。

与ref工作

rust中的引用必须通过&显式创建,以及通过*显式deref;但需注意 .运算符会隐式地deref[左值]以及借用[左值],例如a.name 以及 v.sort() ~ (&mut v).sort().

引用的赋值

let x = 10;
let y = 20;
let mut r = &x; 
if b {r=&y;} // 如果b为true,那么r指向y

引用的引用

let x = 10;
let r: &int = &x;
let rr: &&int = &r;
//...

引用的比较

直接比较最终引用的那个值。如果想比较两个引用的地址,使用std::ptr::eq(rx, ry)来进行比较。注意比较运算符要求两个值的类型是相同的。

可以借用任何表达式的引用

fn gen() -> int {
    1
}

let n = &gen();

assert_eq!(n + &1, 2); 

上面例子中会创建一个临时对象,如果是在let语句中进行赋值,那么这个临时对象就跟变量的lifetime一致;否则,在这一行的语句结束时,其就会被drop。

对slices和trait object的引用

包括两类胖指针:

  1. slices:开始地址和长度
  2. trait object: 值的地址,以及指向trait实现的指针

引用安全性

TODO

posted @ 2025-03-21 23:05  xwher  阅读(20)  评论(0)    收藏  举报