引用与借用
借用
借用(borrowing) 是指,获取变量的引用。
引用与解引用
在Rust中,通过 &
进行引用, 通过 *
进行解引用。
fn main() {
let x = 5;
let y = &x; // 此时 y 是一个 引用
assert_eq!(5, x);
// 对引用类型进行解引用运算,访问y所指向的整数类型
// 如果不进行解引用,则会得到编译错误
assert_eq!(5, *y);
}
不可变引用
不可变引用 仅允许使用值,但不获取所有权。
当引用离开作用域后,其指向的值也不会被丢弃。
fn main() {
let s1 = String::from("aa");
let len = get_str_len(&s1);
println!("the length of '{}' is {}", s1, len);
}
fn get_str_len(s: &String) -> usize {
s.len()
} // 在这里 s 离开了作用域,但它不拥有引用值的所有权,所以什么也不会发生
可变引用
可变引用通过 &mut
声明:
fn main() {
let mut s = String::from("hello"); // 创建一个可变字符串
change_str(&mut s); // 传入一个可变引用
println!("{}", s);
}
fn change_str(s: &mut String) { // s 是一个 可变引用
s.push_str(", world"); // 插入新的字符串切片
}
- 同一个作用域,特定数据只能有一个可变引用
- 同一个值的可变引用和不可变引用不可以同时存在
- 引用必须总是有效的 (即不能引用已经被释放的值)