如何简化带守卫且返回Result的嵌套match的Rust代码?
进一步简化后的Rust代码
针对你已经简化后的代码,还能做这些优化让它更简洁:
use try_guard::guard; /// Parse a Github PR URL into its owner, repo, and PR number pub fn parse_url(url: &str) -> Option<(String, String, u64)> { let url = Url::parse(url).ok()?; guard!(url.scheme() == "https" && url.host() == Some(Host::Domain("github.com"))); let paths = url.path_segments()?.collect::<Vec<_>>(); match paths[..] { [user, repo, "pull", pr_] => { let pr = pr_.parse::<u64>().ok()?; Some((user.to_string(), repo.to_string(), pr)) } _ => None, } } fn from_arg_value(s: &str) -> std::result::Result<FlakeRef, String> { if let Some((owner, repo, pr)) = parse_url(s) { Ok(FlakeRef::GithubPR { owner, repo, pr }) } else { Ok(FlakeRef::Flake(s.to_string())) } }
简化点说明:
- 参数类型优化:把
parse_url的参数从&String改成&str,不用先把s转成String再传引用,直接传入原&str即可,更通用且避免不必要的内存分配。 - 路径收集简化:将
url.path_segments().map(|c| c.collect::<Vec<_>>())?简化为url.path_segments()?.collect::<Vec<_>>(),利用?直接处理path_segments()返回的Option,省去多余的map调用。 - 结构体初始化简写:创建
GithubPR时,因变量名和结构体字段名完全一致,直接用owner, repo, pr的简写形式,替代owner: owner这类重复写法。 - 匹配逻辑简化:用
if let替代match处理parse_url的返回值,结果为Some时直接构造GithubPR,否则返回Flake,代码更简洁直观。
内容的提问来源于stack exchange,提问作者Sridhar Ratnakumar
相关产品推荐
相关产品推荐

