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的引用
包括两类胖指针:
- slices:开始地址和长度
- trait object: 值的地址,以及指向trait实现的指针
引用安全性
TODO