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`所占用的内存
}
评论