-
避免悬挂引用:不要返回对局部变量的引用,因为局部变量在函数结束时会被丢弃
fn bad() -> &String {
let s = String::from("hello");
&s
}
-
不可变引用和可变引用的规则:
- 在同一作用域内,只能有多个不可变引用或一个可变引用
- 不能在有可变引用的同时有不可变引用
let mut s = String::from("hello");
let r1 = &s;
let r2 = &s;
println!("{} and {}", r1, r2);
drop(r1); drop(r2);
let r3 = &mut s;
println!("{}", r3);
-
生命周期注解:对于复杂的情况,可能需要显式指定生命周期
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
-
Deref 自动引用转换:Rust 的自动解引用(deref coercions)可以隐式地将引用转换为其他类型的引用
struct Person {
name: String,
age: u8,
}
fn print_name(p: &Person) {
println!("Name: {}", p.name);
}
fn main() {
let person = Person { name: String::from("Alice"), age: 30 };
print_name(&person);
}