讲动人的故事,写懂人的代码
「席双嘉,听说你的C++项目又因为忘了检查返回值导致内存泄漏,又加班了?」
周五中午,在国内某科技巨头熙熙攘攘的员工餐厅,贾克强半开玩笑地戳了戳坐在隔壁的席双嘉,眼神中满是戏谑。
贾克强,一个热衷于Rust的程序员,总是乐于挑战和探索新技术的边界。
而席双嘉,则是那种深耕于C++领域,有着丰富经验和对性能追求无比执着的老兵。
席双嘉苦笑着摇头,「是啊,这不还是‘常规操作’嘛。我有异常处理,怕啥。」
「‘常规操作’?”贾克强一边调侃,一边用手比划了一个广场舞的动作,“我宁愿跳广场舞,也不想跟着内存泄漏的节奏扭腰。」
席双嘉自嘲地笑了笑,「说得好像你们用Rust能就免疫这些问题似的。」
1 代码对决
这时,贾克强提出了一个小比赛的想法。就是两人午餐后,回到工位,在30分钟内,各自用Rust和C++实现同一个功能——读取文件到字符串中,看看谁的代码不仅稳定还能效率更高。
席双嘉立刻来了精神,眼睛一亮,「好啊,如果我赢了,今晚的加班夜宵你买单!」
贾克强笑着拍胸脯,「行!但如果我赢了,你得穿上我给你准备的‘安全第一,我用Rust’的T恤,还要给团队做个分享。」
两人一拍即合。
午餐后,两人拿着笔记本电脑,步入配备先进设施的会议室。
贾克强把桌上的计时沙漏倒过来,计时开始。
席双嘉不到10分钟就写完了。贾克强大概用了20分钟。
他们各自在大型电视屏幕上展示自己的代码。
贾克强的Rust代码,显示在左边的电视上。
席双嘉的C++代码,则显示在右边。
2 Rust代码讲解
贾克强展示了他写的Rust代码。
use std::fs::File;
use std::io;
use std::io::Read;
// 定义一个函数,尝试读取文件到字符串中
// 这个函数返回 Result 类型,要么是包含文件内容的 String,要么是 io::Error
fn read_file_to_string(path: &str) -> Result<String, io::Error> {
let mut file = match File::open(path) {
Ok(file) => file,
Err(e) => return Err(e),
};
let mut contents = String::new();
match file.read_to_string(&mut contents) {
Ok(_) => Ok(contents),
Err(e) => Err(e),
}
}
// 使用 Option 类型处理可能的空值
fn find_first_line(contents: &str) -> Option<&str> {
contents.lines().next()
}
fn main() {
// 尝试读取一个文件
match read_file_to_string("hello.txt") {
Ok(contents) => {
// 尝试找到文件的第一行
match find_first_line(&contents) {
Some(line) => println!("First line: {}", line),
None => println!("File is empty"),
}
}
Err(e) => println!("Error reading file: {}", e),
}
}
然后他开始给席双嘉讲解。
「这段Rust代码读取一个文件,并打印文件的第一行。」
「它使用Rust的错误处理和Option类型来处理错误和空值。」
2.1 main()
函数
「main
函数是程序的入口点。这个函数调用了 read_file_to_string
函数。使用了硬编码文件名 "hello.txt"。这个函数要打开并读取文件到一个字符串中。」
fn main() {
// 尝试读取一个文件
match read_file_to_string("hello.txt") {
Ok(contents) => {
// ...
}
Err(e) => println!("Error reading file: {}", e),
}
}
<