如何在Rust中对字符串进行两次拆分?(含特定格式转换需求)
解决方案
首先要纠正一个类型问题:你提到的Vec<Vec<&str, i64>>在Rust中是不合法的——Vec只能存储同一种类型的元素,结合你的需求,正确的目标类型应该是Vec<(&str, i64)>(基于原始字符串的引用)或者Vec<(String, i64)>(拥有所有权的字符串)。以下是具体实现:
方案1:基于引用的实现(生命周期依赖原始字符串)
如果原始字符串的生命周期足够覆盖结果的使用场景,可以直接保留引用,避免内存拷贝:
let input = "fooo:3333#baaar:22222"; let result: Vec<(&str, i64)> = input .split('#') .map(|sub_str| { let mut parts = sub_str.split(':'); // 提取键和值,这里假设输入格式完全合法 let key = parts.next().unwrap(); let value = parts.next().unwrap().parse::<i64>().unwrap(); (key, value) }) .collect(); // 最终结果:[("fooo", 3333), ("baaar", 22222)]
方案2:拥有所有权的实现(脱离原始字符串生命周期)
如果需要结果不依赖原始字符串的存在,可以将引用转换为String:
let input = "fooo:3333#baaar:22222"; let result: Vec<(String, i64)> = input .split('#') .map(|sub_str| { let mut parts = sub_str.split(':'); let key = parts.next().unwrap().to_string(); let value = parts.next().unwrap().parse::<i64>().unwrap(); (key, value) }) .collect();
优雅处理格式错误
上面的代码用unwrap假设输入格式绝对合法,如果需要处理非法输入(比如缺少冒号、数值格式错误),可以返回Result类型避免panic:
use std::error::Error; fn parse_input(input: &str) -> Result<Vec<(&str, i64)>, Box<dyn Error>> { input .split('#') .map(|sub_str| { let mut parts = sub_str.split(':'); let key = parts.next().ok_or("每个子串必须包含冒号分隔的键值")?; let value_str = parts.next().ok_or("子串缺少数值部分")?; let value = value_str.parse::<i64>()?; Ok((key, value)) }) .collect() }
内容的提问来源于stack exchange,提问作者Maksim
相关产品推荐
相关产品推荐

