rust101-fieldlog

01 / 10 · 15 分钟

新建一个 crate

在教程仓库外面 cargo new。cargo run 打出灯塔山脊。

你的项目里会动到:Cargo.toml · src/main.rs · src/lib.rs

你要写的程序叫 fieldlog,一本五天的野外日志。样例旅程是灯塔山脊,2026-09-18 到 2026-09-22,47.2 km,爬升 2240 m。第 3 天在鞍部遇上暴风雨。咖啡 80 g,每天 30 g,只够两个早晨。

从这里开始,不要改本仓库里的 fieldlog/。那个目录是写完以后的对照,网站上的报告也从它生成。你的代码放在别的目录,例如 ~/code/fieldlog。十章结束时,你的 crate 能 cargo test,能 cargo run -- brief,也能写出 HTML。对照目录里多一个 summary.rs,那是给网站准备 JSON 的,你不用写。

先有一个能编译的项目

还没装 Rust 的话,先看环境页。装好之后,在教程仓库外面执行下面两条命令。不要加 --lib:默认的 cargo new 会留下 src/main.rs,这一章再自己加 src/lib.rs。

这时还是 cargo 自带的 Hello, world!

终端
cargo new fieldlog
cd fieldlog
cargo run

现在目录里应该有 Cargo.toml、src/main.rs,还没有别的 Rust 文件。把 main.rs 换成下面这份。它调用库里的 banner()。库文件还没写,所以这一步先别 cargo run。

替换 src/main.rs。

src/main.rs
fn main() {
    println!("{}", fieldlog::banner());
}

接着新建 src/lib.rs。Cargo 看到这个文件,就会把库和二进制编在一起。二进制在库外面,所以 banner 要 pub。这里没有 mod。不要从后面的章节抄模块列表过来,那些文件还不存在,编译会直接失败。

新建 src/lib.rs。整份文件就是这些。

src/lib.rs
pub fn banner() -> &'static str {
    "灯塔山脊 · 2026-09-18 到 2026-09-22"
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn banner_names_the_traverse() {
        let text = banner();
        assert!(text.contains("灯塔山脊"));
        assert!(text.contains("2026-09-18"));
        assert!(text.contains("2026-09-22"));
    }
}
cargo run
灯塔山脊 · 2026-09-18 到 2026-09-22

检查点

在教程仓库外面,进入你新建的 fieldlog
cargo test
cargo run

测试通过。终端打出上面那一行。你的项目里仍然只有 main.rs 和 lib.rs。