从 Rust 基础到掌握 — 第 1 集
通过所有权和借用安全地处理内存
该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。
Rust 是一种系统编程语言,旨在在没有垃圾收集器的情况下维护内存安全。 当创建性能很重要的程序时,我们尝试在编译阶段减少无效指针和数据竞争。
价值观有主人
Rust 中的值默认有一个所有者。 当所有者超出范围时,值会自动清除。
fn main() {
let name = String::from("Rose");
print_name(name);
//名称的所有权已转移至函数。
}
fn print_name(value: String) {
println!("{value}");
}
String如果将其作为值传递给函数,所有权就会转移。 如果调用方想继续使用它,它就会借出该值。
通过引用借用值
fn main() {
let name = String::from("Rose");
print_name(&name);
println!("{name}");
}
fn print_name(value: &String) {
println!("{value}");
}
&String是不具有值且被简要阅读的参考。 更改值&mut String您应该使用这样的可变引用:
阻止您同时创建多个可变引用的规则一开始很棘手。 相反,它可以防止执行期间可能发生的错误内存访问和竞争条件。
将失败的可能性表达为一种类型
Rust 经常使用 Option<T> 表示值可能不存在,并使用 Result<T, E> 表示操作可能失败。
fn divide(a: i32, b: i32) -> Result<i32, String> {
if b == 0 {
return Err(String::from("它不能被 0 除。"));
}
Ok(a / b)
}
调用代码必须显式处理成功和失败。 Rust 中的安全性还包括使错误难以被忽视。
Rust 项目是cargo new, cargo run, cargo test它使用相同的 Cargo 命令进行管理。 首先,与其尝试记住所有所有权规则,不如创建一个小型命令行程序并按照编译器消息检查借用范围。