练习
六个函数你来写
在你自己的 crate 里,按章节把函数先写成 todo!。cargo check 可以通过,cargo test 会在这里 panic。写完再跑该章的检查点。下面的解答摘自那一章结束时的快照,和测试调用的是同一份函数。
请你写 · 02 用 struct 记下一天
算出这一天的配速
分钟为 0 时返回 None。其他情况返回每小时公里数。
pub fn pace_kmh(distance_m: u32, minutes: u32) -> Option<f64>
小时数是 minutes as f64 / 60.0。公里数是 distance_m as f64 / 1000.0。
请你写 · 03 用 enum 表示天气
给每种天气一个中文
用 match 返回「晴」「雾」「雨」「暴风雨」「雪」。不要写 _ 分支。
pub fn weather_label(weather: Weather) -> &'static str
五种分支,每种一个字符串字面量。返回 &'static str,这些词和程序活得一样久。
请你写 · 04 Journal 拥有这些天
找出里程最长的一天
返回切片里的一个引用。空切片返回 None。不要克隆 DayLog。里程相同的时候,留下较晚的那一天。
pub fn longest_day(days: &[DayLog]) -> Option<&DayLog>
days.iter().max_by_key(|day| day.distance_m)。引用和传入的切片活得一样久,生命周期可以不写。
请你写 · 05 口粮不够就返回 Result
扣掉这一天的餐数
够就返回剩下的顿数。不够就返回 FieldError::RationUnderflow { have, need }。不要 panic,不够时也不要返回 Ok(0)。
pub fn consume_rations(stock: u32, meals: u32) -> Result<u32, FieldError>
stock.checked_sub(meals) 得到 Option。再用 ok_or 变成 Result。
请你写 · 06 打出第一份简报
估算咖啡还够几个早晨
per_day 为 0,或者计划天数为 0,返回 Enough { days_covered: days_planned }。克数盖得住计划时也返回 Enough,days_covered 用计划天数,不要把多出来的克数算成计划外的一天。否则返回 Short,带上完整早晨数,以及还差的克数。
pub fn coffee_outlook(grams: u32, per_day: u32, days_planned: u32) -> CoffeeOutlook
完整早晨数是 grams / per_day。还差的克数是 per_day * days_planned - grams。只有克数不够才进这个分支。
请你写 · 07 用 iterator 算整趟路
算整趟路的配速
把总米数和总分钟交给 pace_kmh。不要先算出每一天的配速再平均。休息日没有配速,短的一天也不该和长的一天权重相同。
pub fn average_pace_kmh(days: &[DayLog]) -> Option<f64>
先写 moving_minutes 和 total_distance_m。总分钟为 0 时,pace_kmh 会返回 None。
已经写好 · 10 导出 HTML
把笔记里的标记变成文本
确认四个字符被换掉:& < > "。其他字符原样留下。这一章没有要你补的空函数。写完 report.rs 之后,用浏览器把文件打开。
pub fn escape_html(text: &str) -> String
按字符 match。& 放在同一次扫描里换成 &,不会被再转一次。