Rust实现to_title方法:split分隔符判断及优化问题
Rust to_title()方法实现的三个技术问题解答
我尝试实现一个简单的to_title()方法,对包含空格和横杠的字符串进行标题化处理,初始代码如下:
fn to_title(s: &mut String) { let mut res = "".to_string(); for word in s.split(|c| c == ' ' || c == '-') { if !res.is_empty() { res.push(' ') // 如何判断此处是按空格还是横杠拆分的? } let mut word = word.to_string(); uc_first(&mut word); res.push_str(&word) } *s = res }
问题1:如何判断split使用的是空格' '还是横杠'-',从而添加对应的分隔符?
split方法会直接丢弃分隔符,无法直接获取拆分时使用的字符。更合理的做法是直接遍历字符串字符,同时保留原分隔符,顺便完成标题化处理,示例代码:
fn to_title(s: &mut String) { let mut res = String::with_capacity(s.len()); let mut capitalize_next = true; for c in s.chars() { if c == ' ' || c == '-' { res.push(c); // 直接保留原分隔符 capitalize_next = true; } else if capitalize_next { res.push(c.to_ascii_uppercase()); capitalize_next = false; } else { res.push(c.to_ascii_lowercase()); } } *s = res; }
这种方式既不用纠结分隔符类型,也能完整保留原字符串的分隔符。
问题2:是否可以用char::is_whitespace()替代' '进行判断?
完全可以。char::is_whitespace()会匹配所有Unicode标准中的空白字符(包括空格、制表符\t、换行符\n等),如果你的需求是将所有空白字符都作为标题拆分的分隔符,使用它会更通用。只需将判断条件修改为:
if c.is_whitespace() || c == '-' { // ... }
如果仅需要处理普通空格,保留c == ' '即可。
问题3:是否有更高效的实现方式?
上面的字符遍历实现已经是高效方案,核心优化点:
- 用
String::with_capacity(s.len())预先分配与原字符串长度一致的内存,避免多次扩容带来的性能损耗 - 直接遍历原字符串的字符,无额外的字符串拆分、拷贝操作
- 时间复杂度为O(n),每个字符仅处理一次
也可以用迭代器链式调用实现,代码更简洁,性能与手动遍历持平:
fn to_title(s: &mut String) { let mut capitalize_next = true; let res: String = s.chars() .map(|c| { if c.is_whitespace() || c == '-' { capitalize_next = true; c } else if capitalize_next { capitalize_next = false; c.to_ascii_uppercase() } else { c.to_ascii_lowercase() } }) .collect(); *s = res; }
如果需要处理Unicode复杂大小写转换(如德语ß转SS),可以引入unicode-case等第三方crate,但仅处理ASCII字符时,上述实现足够高效。
内容的提问来源于stack exchange,提问作者Fred Hors
相关产品推荐
相关产品推荐

