Rust 简介
Rust 以其内存安全和速度的保证而闻名。它独特地通过所有权、借用和生命周期来管理内存。
内存安全原则
Rust 编译器检查确保内存安全,防止诸如缓冲区溢出之类的常见错误。
所有权系统
所有权是核心特性。当变量超出作用域时,Rust 会自动清理其资源。
fn main() {
let s = String::from("hello"); // s 拥有字符串
} // s 超出作用域,内存被释放
借用和引用
Rust 使用引用来借用,确保数据不会被同时修改和读取。
fn main() {
let s1 = String::from("hello");
let len = calculate_length(&s1);
println!("The length of '{}' is {}.", s1, len);
}
fn calculate_length(s: &String) -> usize {
s.len()
}
切片
切片允许您引用集合的一部分,而不需要获取所有权。
fn first_word(s: &String) -> &str {
let bytes = s.as_bytes();
for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return &s[0..i];
}
}
&s[..]
}
使用结构体
结构体用于创建自定义数据类型。
struct User {
username: String,
email: String,
sign_in_count: u64,
active: bool,
}
枚举和模式匹配
枚举通过列举其可能的变体来定义类型。
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
错误处理:Result 和 Option 类型
Rust 使用 Result 和 Option 进行显式错误处理。
fn divide(numerator: f64, denominator: f64) -> Option {
if denominator == 0.0 {
None
} else {
Some(numerator / denominator)
}
}
集合:Vec, HashMap
向量和哈希映射存储值的集合。
let v: Vec = Vec::new();
let mut scores: HashMap = HashMap::new();
迭代器和闭包
迭代器处理集合,闭包是匿名函数。
let v1 = vec![1, 2, 3];
let v2: Vec<_> = v1.iter().map(|x| x + 1).collect();
智能指针:Box, Rc, Arc
智能指针,如 Box,允许复杂的数据结构。
let b = Box::new(5);
println!("b = {}", b);
并发:线程, Send 和 Sync 特征
Rust 支持安全的并发,确保线程安全。
use std::thread;
let handle = thread::spawn(|| {
for _ in 1..10 {
println!("Hi from the thread!");
}
});
使用 Cargo 和 Crates.io
Cargo 管理 Rust 项目,处理编译和依赖。
[dependencies]
serde = "1.0"
特征和特征边界
特征定义了类型之间的共享行为。
pub trait Summary {
fn summarize(&self) -> String;
}
泛型
泛型抽象了类型,实现了代码复用。
fn largest(list: &[T]) -> T {
let mut largest = list[0];
for &item in list.iter() {
if item > largest {
largest = item;
}
}
largest
}
宏和编译器插件
宏在编译时生成代码,提供了元编程能力。
macro_rules! say_hello {
() => {
println!("Hello!");
};
}
编写测试
和文档** Rust 支持测试和文档作为一等特性。
/// 将两个数字相加。
fn add(a: i32, b: i32) -> i32 {
a + b
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_add() {
assert_eq!(add(2, 2), 4);
}
}
异步编程:async 和 await
Rust 的异步编程是高效且非阻塞的。
async fn fetch_data() -> Result<(), Box> {
// 异步获取数据
}
使用 Cargo.toml 和 Cargo.lock 管理依赖
依赖在 Cargo.toml 中管理,而 Cargo.lock 确保可复现性。
[dependencies]
futures = "0.3"
Rust 版本和过渡
Rust 版本允许语言的增量、兼容升级。
// 在 Cargo.toml 中指定 Rust 版本
edition = "2018"
很多没有学过 Rust 或只听别人说比较难,心里就觉得很难。首先 Rust 使用先进的内存管理机制,如所有权和借用规则,确保了代码的安全性,同时避免了垃圾回收的开销。这些特性使得 Rust 代码在编译时就能捕捉到潜在的错误,从而减少了运行时的不确定性。
虽然,这些概念是使用细节增加了学习的曲线,但长远来看,它提高了代码质量和系统的可靠性,使得编程变得更加智能和高效,而不是认为它很难,从而放弃,然后每天自己修复 Bug 到凌晨1点钟。