Rust代码优化:返回并合并迭代器,避免不必要堆分配
优化Rust Actix Redis键构造代码:减少分配+简化逻辑
先上优化后的完整代码,解决你提到的冗余分配和Option转换问题:
#[derive(Debug, Deserialize)] struct RouteRequest { proto: String, ids: Option<String>, aliases: Option<String> } fn get_redis_keys(req: web::Form<RouteRequest>) -> Vec<String> { // 通用前缀处理函数,返回迭代器而非Vec fn add_prefix<'a>(prefix: &'static str, s: &'a str) -> impl Iterator<Item = String> + 'a { s.split(",").map(move |part| format!("{prefix}{part}")) } req.ids // 把Option<String>转成Option<&str>,直接拿到字符串引用 .as_deref() // 把Option转成迭代器:有值时是单元素迭代器,无值时是空迭代器 .into_iter() // 展开分割后的字符串迭代器 .flat_map(|s| add_prefix("id:", s)) // 链式处理别名的逻辑 .chain( req.aliases .as_deref() .into_iter() .flat_map(|s| add_prefix("aid:", s)) ) // 最后一次性收集成Vec,只做一次堆分配 .collect() }
核心优化点说明:
- 消除重复代码:把两个逻辑几乎一致的辅助函数合并成通用的
add_prefix,通过传入不同前缀实现复用,减少冗余。 - 减少堆分配:原代码中每个辅助函数都会先生成一个Vec,再合并,现在全程用迭代器处理,只有最后
collect的时候才分配一次Vec,避免了中间两次不必要的堆内存申请。 - 简化Option转换:用
as_deref()替代手动的as_ref(),直接把Option<String>转为Option<&str>,不需要再处理Option<&String>的额外引用层级,代码更简洁。 - 迭代器链式风格:用Rust惯用的迭代器链式调用组织逻辑,流程清晰,符合函数式编程的最佳实践,可读性更强。
验证效果
当传入:
RouteRequest { ids: Some("foo,bar".to_string()), aliases: Some("baz,crux".to_string()) }
get_redis_keys会返回预期的:
vec!["id:foo".to_string(), "id:bar".to_string(), "aid:baz".to_string(), "aid:crux".to_string()]
内容的提问来源于stack exchange,提问作者eof
相关产品推荐
相关产品推荐

