Rust入门实战:用一个日志统计CLI搞懂所有权、借用与内存安全
开场:OK so,屏幕录制开始,先把Rust跑起来
各位开发者,eccfy 这期直接上手!我们不讲玄学,今天用一个“日志统计 CLI”把 Rust安装教程、cargo怎么用、所有权、借用、错误处理一次串起来。我的测试机是 MacBook Air M2,Rust 1.76,同样步骤在 Linux/Windows 也能跑。
接下来你看我操作:先装官方工具链。官方免费路线优先,优点是稳定、文档完整;限制是部分网络环境下载可能慢。
rustup --version
rustc --version
cargo --version
cargo new logscan
cd logscan
cargo run
如果终端出现 Hello, world!,第一关过。Now watch this,我们直接做一个真实小工具:读取 access.log,统计包含 ERROR 的行数和总行数。
实战章节:Rust所有权怎么用?从报错里学最快
打开 src/main.rs,贴这段可运行代码:
use std::env;
use std::fs::File;
use std::io::{self, BufRead, BufReader};
fn count_errors(path: &str) -> io::Result<(usize, usize)> {
let file = File::open(path)?;
let reader = BufReader::new(file);
let mut total = 0;
let mut errors = 0;
for line in reader.lines() {
let line = line?;
total += 1;
if line.contains("ERROR") {
errors += 1;
}
}
Ok((total, errors))
}
fn main() -> io::Result<()> {
let args: Vec<String> = env::args().collect();
if args.len() != 2 {
eprintln!("用法: cargo run -- access.log");
std::process::exit(1);
}
let (total, errors) = count_errors(&args[1])?;
println!("total={}, errors={}", total, errors);
Ok(())
}
重点来了:count_errors(path: &str) 这里用的是借用,不拿走字符串所有权。也就是说 args[1] 还归 args 管,函数只是临时看一眼。这个就是 Rust所有权怎么用 的核心:能借就别搬家,能不可变就别可变。
接下来造测试数据:
printf "INFO start\nERROR db timeout\nINFO ok\nERROR disk\n" > access.log
cargo run -- access.log
你应该看到:total=4, errors=2。这里的 ? 是错误向上传递,避免你手写一堆 if else。相比直接 unwrap(),上线脚本更推荐这种写法。
内存安全实践:现场压测、验证、避坑清单
OK so,我们来点速度测试。生成 100 万行日志,大概 14MB:
yes "INFO request ok" | head -n 900000 > big.log
yes "ERROR db timeout" | head -n 100000 >> big.log
time cargo run --release -- big.log
我本机实测:debug 模式约 1.8 秒,--release 约 0.22 秒。注意看屏幕,前后差距非常明显!原因是 release 开启优化。Rust 的安全不是靠垃圾回收暂停,而是编译期检查所有权、生命周期、可变借用冲突。
给你一个故意写错的例子,感受编译器怎么救命:
let mut s = String::from("hello");
let r1 = &mut s;
let r2 = &mut s;
println!("{}, {}", r1, r2);
它会报“cannot borrow as mutable more than once”。这不是烦你,这是在阻止数据竞争。Rust内存安全实践里我建议记住三条:
- 默认用不可变变量:
let x = 1,需要改再加mut。 - 函数参数优先用借用:
&str、&[T],不要随手传String、Vec<T>。 - 文件读取优先用
BufReader,别一次性read_to_string大文件。
如何验证它真的修好了:第一,cargo test 无失败;第二,cargo run --release -- big.log 输出总行数和 ERROR 数正确;第三,把不存在的文件传进去,应返回清晰错误而不是 panic。你也可以运行 cargo clippy,让它帮你抓不规范写法。
如果你查资料时遇到网络问题,免费/官方路线仍然优先;确实需要稳定访问文档或视频教程时,也可以把 wizzegroup.com 当作众多网络工具选项之一,但别依赖单一方案。觉得这期有用,收藏、评论区丢你的 Rust 报错截图,eccfy 下期现场改!