rust101-fieldlog

练习

六个函数你来写

在你自己的 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。

回到这一章src/stats.rs

请你写 · 03 用 enum 表示天气

给每种天气一个中文

用 match 返回「晴」「雾」「雨」「暴风雨」「雪」。不要写 _ 分支。

pub fn weather_label(weather: Weather) -> &'static str

五种分支,每种一个字符串字面量。返回 &'static str,这些词和程序活得一样久。

回到这一章src/model.rs

请你写 · 04 Journal 拥有这些天

找出里程最长的一天

返回切片里的一个引用。空切片返回 None。不要克隆 DayLog。里程相同的时候,留下较晚的那一天。

pub fn longest_day(days: &[DayLog]) -> Option<&DayLog>

days.iter().max_by_key(|day| day.distance_m)。引用和传入的切片活得一样久,生命周期可以不写。

回到这一章src/stats.rs

请你写 · 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。

回到这一章src/model.rs

请你写 · 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。只有克数不够才进这个分支。

回到这一章src/briefing.rs

请你写 · 07 用 iterator 算整趟路

算整趟路的配速

把总米数和总分钟交给 pace_kmh。不要先算出每一天的配速再平均。休息日没有配速,短的一天也不该和长的一天权重相同。

pub fn average_pace_kmh(days: &[DayLog]) -> Option<f64>

先写 moving_minutes 和 total_distance_m。总分钟为 0 时,pace_kmh 会返回 None。

回到这一章src/stats.rs

已经写好 · 10 导出 HTML

把笔记里的标记变成文本

确认四个字符被换掉:& < > "。其他字符原样留下。这一章没有要你补的空函数。写完 report.rs 之后,用浏览器把文件打开。

pub fn escape_html(text: &str) -> String

按字符 match。& 放在同一次扫描里换成 &amp;,不会被再转一次。

回到这一章src/report.rs