安装Rust:
访问Rust官方网站(https://www.rust-lang.org/),下载并安装适合操作系统的Rustup工具。Rustup是Rust的版本管理工具,能帮助轻松安装和管理不同版本的Rust工具链。安装完成后,在命令行中运行
rustc --version和
cargo --version来检查它们是否成功安装。
rustc是Rust编译器,
cargo是Rust的包管理器和构建系统。 开发工具配置:
推荐使用Visual Studio Code(VS Code)作为开发环境。VS Code是一款轻量级且功能强大的跨平台代码编辑器,拥有丰富的插件生态系统。安装VS Code后,打开扩展图标(或使用快捷键Ctrl+Shift+X),在搜索框中输入“rust-analyzer”,找到并安装这个插件。rust-analyzer是Rust官方推荐的语言服务器插件,它为VS Code提供了强大的Rust语言支持,包括代码补全、语法检查、代码导航、错误提示等功能。变量与常量:
变量使用
let关键字声明,默认是不可变的。例如:
let x = 5;。常量使用
const关键字声明,必须指定类型。例如:
const MAX_POINTS: u32 = 100_000;。Rust是静态类型语言,变量声明时通常可以省略类型,编译器会根据初始值自动推断类型。 数据类型:
Rust的基本数据类型包括整型、浮点型、布尔型等。整型又细分为有符号整数(如
i8、
i16、
i32、
i64、
i128以及
isize)和无符号整数(如
u8、
u16、
u32、
u64、
u128以及
usize)。浮点型有
f32(单精度)和
f64(双精度),Rust默认使用
f64类型。布尔型
bool只有两个值:
true和
false。 控制流语句:
Rust提供了多种控制流结构,如
if表达式、
match表达式、循环(
loop、
while、
for)等。
if表达式用于根据条件执行不同的代码块。例如:
let number = 5;
if number < 0 {
println!("It's negative");
} else if number == 0 {
println!("It's zero");
} else {
println!("It's positive");
}
match表达式是强大的模式匹配工具,可以替换多个
if-else语句,使代码更加清晰和可维护。例如:
let number = 1;
match number {
0 => println!("zero"),
1 => println!("one"),
2..=10 => println!("between two and ten"),
_ => println!("something else"),
}
所有权与借用:
所有权是Rust的核心特性,用于管理内存。Rust中的每个值都有一个所有者,同一时间只能有一个所有者,当所有者超出作用域时,值将被丢弃。移动(Move)语义:当一个值被赋给另一个变量时,原始变量的所有权会转移给新变量,原始变量不再有效。例如:
let x = 5;
let y = x; // x的值移动到y,x不再有效
借用(Borrow)机制:通过引用可以临时借用值的所有权,而不转移所有权。引用分为不可变引用(
&T)和可变引用(
&mut T)。例如:
let s1 = String::from("hello");
let s2 = &s1; // s2借用了s1的值(不可变引用)
结构体与枚举:
结构体(Structs)允许将多个相关的值组合成一个复合类型。例如:
struct User {
username: String,
email: String,
sign_in_count: u64,
active: bool,
}
枚举(Enums)允许定义一个类型,该类型可以是几个预定义的变体之一。例如:
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
错误处理:
Rust使用
Result枚举和
panic!宏进行错误处理。
Result类型有两个变体:
Ok和
Err,分别表示操作成功和失败。例如:
use std::fs::File;
use std::io;
use std::io::Read;
fn read_file(filename: &str) -> Result<String, io::Error> {
let mut file = File::open(filename)?; // `?`操作符用于处理`Err`
let mut contents = String::new();
file.read_to_string(&mut contents)?;
Ok(contents)
}
fn main() {
match read_file("hello.txt") {
Ok(contents) => println!("File contents: {}", contents),
Err(e) => println!("An error occurred: {}", e),
}
}
panic!宏用于在程序遇到不可恢复的错误时终止程序执行,并打印错误信息。
创建新项目:
使用
cargo new project_name命令创建一个新项目,其中
project_name是希望给项目起的名字。这个命令会创建一个新目录,并在其中设置Rust项目的结构,包括
src目录和
Cargo.toml文件。
src目录用于存放Rust源文件,
Cargo.toml是项目的配置文件,它列出了项目的依赖和其他设置。 编写简单程序:
在
src/main.rs文件中编写一个简单的Rust程序,例如一个计算器程序。以下是一个简单的计算器实现示例:
use std::io;
fn main() {
println!("请输入第一个数字:");
let mut input = String::new();
io::stdin().read_line(&mut input).expect("读取输入失败");
let num1: f64 = input.trim().parse().expect("请输入有效的数字");
println!("请输入第二个数字:");
let mut input = String::new();
io::stdin().read_line(&mut input).expect("读取输入失败");
let num2: f64 = input.trim().parse().expect("请输入有效的数字");
println!("请输入运算符(+、-、*、/):");
let mut operator = String::new();
io::stdin().read_line(&mut operator).expect("读取输入失败");
let operator = operator.trim();
let result = match operator {
"+" => num1 + num2,
"-" => num1 - num2,
"*" => num1 * num2,
"/" => {
if num2 == 0.0 {
panic!("除数不能为零");
} else {
num1 / num2
}
},
_ => panic!("无效的运算符"),
};
println!("结果: {}", result);
}
编译并运行程序:
在项目目录下打开命令行,运行
cargo run命令。Cargo会编译项目,并运行生成的可执行文件。
编写单元测试:
Rust内置了轻量且强大的测试框架,无需依赖外部工具即可编写和运行单元测试。单元测试通常位于源码文件内,放在
mod tests模块中,用于验证私有函数逻辑。每个测试函数需使用
#[test]属性标记。当函数正常返回时视为通过,若发生
panic则失败。例如:
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
let result = 2 + 2;
assert_eq!(result, 4); // 断言成功,测试通过
}
#[test]
fn another_test() {
panic!("测试应失败"); // 显式panic,测试失败
}
}
运行测试:
使用
cargo test命令运行项目中的所有测试用例。输出将显示每个测试的运行状态、耗时以及失败详情(如有)。 调试程序:
使用VS Code的调试功能来调试Rust程序。首先,在VS Code中打开Rust项目,然后点击左侧的调试图标(或使用快捷键Ctrl+Shift+D)。点击“创建launch.json文件”,选择“Rust”环境。VS Code会生成一个
launch.json文件,其中包含了调试配置。设置断点,然后点击调试工具栏中的“开始调试”按钮(或使用快捷键F5)来启动调试会话。在调试过程中,可以查看变量值、调用栈等信息,帮助定位问题。
'符号标记生命周期参数(如
'a),并通过泛型注解显式声明引用的有效范围。示例:
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() { x } else { y }
}
// 返回值生命周期与输入参数一致,避免悬垂引用
Box<T>:堆分配数据,适用于大对象或递归类型(如链表)。
let b: Box<i32> = Box::new(5);
Rc<T>:引用计数智能指针,支持多所有权(线程不安全)。
use std::rc::Rc;
let a = Rc::new(5);
let b = a.clone(); // 引用计数+1
RefCell<T>:内部可变性,允许运行时检查借用规则(配合
Rc<T>使用)。
use std::cell::RefCell;
let x = RefCell::new(42);
*x.borrow_mut() = 100; // 运行时检查可变借用
线程安全版本:
Arc<T>(原子引用计数)和
Mutex<T>/
RwLock<T>(互斥锁)。
std::thread::spawn。
use std::thread;
let handle = thread::spawn(|| {
println!("Hello from a thread!");
});
handle.join().unwrap(); // 等待线程结束
消息传递:通过
std::sync::mpsc(多生产者单消费者)通道。
use std::sync::mpsc;
let (tx, rx) = mpsc::channel();
thread::spawn(move || { tx.send("Hello").unwrap(); });
println!("Received: {}", rx.recv().unwrap());
共享状态并发:使用
Arc<Mutex<T>>安全共享数据。
use std::sync::{Arc, Mutex};
let counter = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let counter = Arc::clone(&counter);
let handle = thread::spawn(move || {
let mut num = counter.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for handle in handles { handle.join().unwrap(); }
println!("Result: {}", *counter.lock().unwrap());
async/await:使用
tokio或
async-std运行时。
use tokio::io::{self, AsyncWriteExt};
#[tokio::main]
async fn main() -> io::Result<()> {
let mut file = tokio::fs::File::create("test.txt").await?;
file.write_all(b"Hello, async!").await?;
Ok(())
}
流处理:
async-stream或
futures库处理异步序列。
let sum: i32 = (1..100).filter(|x| x % 2 == 0).sum();
#[repr(C)]控制内存布局,避免对齐浪费。
#[repr(C)]
struct MyStruct {
a: u8,
b: u32, // 填充3字节以对齐u32
}
枚举标签优化:
#[repr(i32)]指定枚举变体的判别式类型。
#[inline(always)]强制内联小函数。
#[inline(always)]
fn add(a: i32, b: i32) -> i32 { a + b }
编译标志:
-C opt-level=3(发布模式默认启用)最大化优化。
perf(Linux):统计CPU周期、缓存命中率等。
perf stat -e cache-misses,cycles ./target/release/my_program
flamegraph:生成火焰图可视化函数调用耗时。
cargo install flamegraph
cargo flamegraph --bin my_program
Cargo.toml:定义依赖、版本和特性标志。
[dependencies]
serde = { version = "1.0", features = ["derive"] }
tokio = { version = "1.0", features = ["full"] }
工作区(Workspace):管理多包项目。
[workspace]
members = ["lib1", "lib2", "bin"]
rustfmt:自动格式化代码。
cargo fmt
cargo-udeps:检测未使用的依赖。
cargo install cargo-udeps
cargo udeps
rustup target add x86_64-pc-windows-msvc
cargo build --target x86_64-pc-windows-msvc
actix-web)
use actix_web::{get, web, App, HttpResponse, HttpServer, Responder};
#[get("/hello/{name}")]
async fn hello(name: web::Path<String>) -> impl Responder {
format!("Hello, {}!", name)
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| App::new().service(hello))
.bind("127.0.0.1:8080")?
.run()
.await
}
关键点:异步处理、路由匹配、HTTP响应构建。
sqlx)
use sqlx::{mysql, Pool};
use std::env;
#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
let url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
let pool = Pool::<mysql::Pool>::connect(&url).await?;
let row: (i32,) = sqlx::query_as("SELECT $1")
.bind(150_i32)
.fetch_one(&pool)
.await?;
println!("Result: {}", row.0);
Ok(())
}
关键点:异步查询、类型安全、连接池管理。
clap)
use clap::Parser;
#[derive(Parser)]
#[command(author, version, about)]
struct Args {
#[arg(short, long)]
input: String,
#[arg(short, long, default_value = "10")]
count: usize,
}
fn main() {
let args = Args::parse();
println!("Input: {}, Count: {}", args.input, args.count);
}
关键点:参数解析、帮助文档生成、默认值设置。
借用检查错误:
let mut s = String::from("hello");
let r1 = &s;
let r2 = &mut s; // 错误:不能同时存在不可变和可变引用
解决:调整作用域或使用
RefCell<T>。
生命周期错误:
fn invalid_output() -> &String {
let s = String::from("hello");
&s // 错误:返回局部变量的引用
}
解决:返回
String或使用生命周期注解。
println!宏:快速打印变量值。
log crate:结构化日志(配合
env_logger)。
use log::{info, LevelFilter};
use env_logger;
fn main() {
env_logger::init();
info!("Starting program");
}
GDB/LLDB:调试器附加到进程。
rust-gdb ./target/debug/my_program
panic钩子:
use std::panic;
panic::set_hook(Box::new(|info| {
eprintln!("Panic occurred: {}", info);
}));
¥128.00
牛津精品阅读 马文3册合售 英文原版 Marv and the Dino Attack 马文和恐龙袭击 巨型机器人 危险之池全彩漫画小说 牛津大学出版社
¥128.00
牛津精品阅读 马文3册合售 英文原版 Marv and the Dino Attack 马文和恐龙袭击 巨型机器人 危险之池全彩漫画小说 牛津大学出版社
¥122.00
牛津出版 马文3册 英文原版章节漫画小说 Marv and the Dino Attack 马文和恐龙袭击 巨型机器人 危险之池 牛津大学出版社
¥99.00
大蜘蛛遥控电动会走玩具仿真巨型假动物宠物恐龙机器人吓人小男孩
¥139.00
巨神战击队3旋天战击王玄天战机对巨型2冲锋爆裂豪华版机器人玩具
¥55.80
正版植物大战僵尸2变形玩具儿童男孩合体机甲巨型机器人boss模型