引用
&
:引用符号,允许使用值,但是不获取所有权。*
:解引用符号
fn main() {
let x = 5;
let y = &x;
assert_eq!(5, x);
assert_eq!(5, *y);
}
fn main() {
let s1 = String::from("hello");
let len = calculate_length(&s1);
println!("The lenght of '{}' is {}.", s1, len);
}
fn calculate_length(s: &String) -> usize {
s.len()
}
不可变引用
一般情况下,不能修改引用值:
fn main() {
let s = String::from("hello");
change(&s);
}
fn change(some_string: &String) {
// ERROR!
some_string.push_str(", world");
}
可变引用
要修改值,需使用可变引用:
fn main() {
let s = String::from("hello");
change(&mut s);
}
fn change(some_string: &mut String) {
// Correct!
some_string.push_str(", world");
}
- 同一作用域,特定数据只能有一个可变引用!
- 可变引用与不可变引用不能同时存在!
在使用 &mut
引用原变量,到 &mut
被释放前,无法修改原变量:
fn main() {
let mut x = 1;
let y = &mut x;
// 报错!
x = 2;
*y = 3;
}
以上代码无法通过编译,执行到x = 2
时,变量的所有权还在y
上。该关键字的英文为borrowing
,从英文理解更加简单一些,国内也有将其翻译为借用。