研发协作
在保证行为不变的前提下简化 RTK Rust…
当 RTK 项目的 Rust 代码被评价为「太啰嗦」「过度设计」或需要「重构得更地道」时,按 Rust 惯用法做等价简化,并保留项目特有的强制约束。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
在保证行为不变的前提下简化 RTK Ru特定
解决思路
- 先确认并保留不可简化的项目约束:LazyLock 正则不能移进函数内部;每个 `?` 上的 `.context()` 虽然啰嗦但必须保留;回退到原始命令(raw command fallback)的分支即使看起来像死代码也不能删;退出码传播不能简化成 `Ok(())`;`#[cfg(test)] mod tests` 测试模块不能删除。
- 用手动循环改写成迭代器链:`input.lines().map(|l| l.trim()).filter(|l| !l.is_empty() && l.starts_with("error")).map(str::to_string).collect()`,替代 `let mut result = Vec::new();` + `for` + `push` 的写法。
- 用 `lines.join("\n")` 替代手动 `push_str` 加换行判断的字符串拼接循环。
- 把嵌套 match 改成 Option/Result 链式调用:`maybe_value.and_then(|v| transform(v).ok()).unwrap_or(default)`,替代 `Some(v) => match transform(v) { Ok(r) => r, Err(_) => default }, None => default`。
- 函数参数用结构体解构代替重复字段访问:`fn process(&MyArgs { ref command, ref subcommand, .. }: &MyArgs)`,然后直接用 `command`、`subcommand`。
- 用早返回(early return)压平深层嵌套:先 `if input.is_empty() { return None; }`,再用 `let line = input.lines().next()?;` 与反向条件 `if !line.starts_with("error") { return None; }`。
- 去掉多余的 clone:直接以 `&str` 参数做 `input.lines().filter(...).collect::<Vec<_>>().join("\n")`,而不是先 `let s = input.to_string();`。
- 单一变体的 match 改用 `if let`(如 `if let Ok(s) = output { process(&s); }`),但在 RTK filter 中必须用 `eprintln!` + fallback 显式处理 `Err`,不能静默丢弃。
- 简化后运行回归验证:`cargo fmt --all && cargo clippy --all-targets && cargo test`。
- 用 `grep -n "Regex::new" src/<file>.rs` 检查是否在函数内新建正则;固定/复用的模式必须放在 `LazyLock<Regex>` 静态变量里。
- 用 `grep -n "\.unwrap()" src/<file>.rs` 检查生产代码是否新增 unwrap;`.unwrap()` 只应出现在 `#[cfg(test)]` 块中。
- 保留 `static RE: LazyLock<Regex> = LazyLock::new(|| Regex::new(...).unwrap());` 中初始化期的 `.unwrap()`,它可接受、不要改动。
- 保留 `.context("description")?` 链,虽然啰嗦但项目要求。
- 保留回退匹配臂 `Err(e) => { eprintln!(...); raw_output }`,看似冗余实为安全网。
- 保留 `run()` 结尾的 `std::process::exit(code)`,它看起来能写成 `Ok(())` 但并非等价。
适用边界 · 注意事项
- 非 Rust 代码或非 RTK 项目不适用——`.context()`、fallback、退出码传播等约束是 RTK 特有的。
- 当简化会破坏 RTK 强制约束时不适用,例如删掉 `.context()`、把 fallback 当死代码移除、把 `std::process::exit(code)` 改成 `Ok(())`、把正则移进函数或去掉测试模块。
- 不要为了「更简短」而在生产代码引入 `.unwrap()` 或静默吞掉 `Err`。