从 Rust 基础到掌握 — 第 3 集
将所有权、借用和切片与代码连接起来
该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。
Rust 中的所有权是一条在编译时决定谁清理内存的规则。 在函数类型中指示该值是否将被移动、只读或可变。
移动值
fn print_name(name: String) {
println!("{name}");
}
let player_name = String::from("Rose");
print_name(player_name);
//此处不能再次使用player_name。
String 拥有堆数据,因此在分配或传递值时所有权会发生变化。 为了保持原件有效,您必须明确复制或引用它。
不可变和可变引用
fn print_name(name: &str) {
println!("{name}");
}
fn add_suffix(name: &mut String) {
name.push_str("_01");
}
let mut player_name = String::from("Rose");
print_name(&player_name);
add_suffix(&mut player_name);
简单借用 &str 来读取字符串内容,借用 &mut String 来更改值。 您不能在同一范围内同时使用一个可变引用和另一引用。
此限制可防止读取值时发生更改或同时在两个位置进行修改的情况。
切片
fn first_word(text: &str) -> &str {
match text.find(' ') {
Some(index) => &text[..index],
None => text,
}
}
切片是对字符串或数组的连续部分的引用,但不拥有它。 不需要整个字符串的函数可以通过接收 &str 来使用字符串文字和字符串切片。
参考的生命周期
编译器确保引用的寿命不会超过原始引用的寿命。 如果您尝试返回对函数外部局部变量的引用,它将无法编译,因为原始变量首先消失。
当遇到所有权错误时,您应该首先确定该值的实际所有者应该是谁,而不是首先克隆它。 借用是一种避免复制的技术,同时也是一种限制打字访问权的合同。