Rust实现字符串单词反转时空格丢失触发断言失败如何修复?
问题现象
单词反转程序运行时触发主线程panic,报错信息如下:
thread 'main' panicked at 'assertion failed: `(left == right)` left: `"abcd"`, right: `"a b c d"`', src/main.rs:11:5
原有实现代码:
fn reverse_words(words: &str) -> String { words.split_whitespace().map(reverse_word).collect() } fn reverse_word(word: &str) -> String { word.chars().rev().collect() } fn main() { assert_eq!(reverse_words("apple"), "elppa"); assert_eq!(reverse_words("a b c d"), "a b c d"); assert_eq!(reverse_words("double spaced words"), "elbuod decaps sdrow"); }
根因分析
split_whitespace()方法会将任意长度的连续空白字符统一识别为分隔符,分割结果直接丢弃所有空白字符的长度、位置信息。后续collect()将反转后的单词拼接为字符串时,默认不会插入任何分隔符,因此完全丢失原字符串的单空格、多空格分隔结构,最终输出结果和预期不符,触发断言失败。
修复代码
核心思路是保留原字符串的所有空白结构,仅对非空白的单词部分做字符反转:
fn reverse_words(words: &str) -> String { words .split_inclusive(char::is_whitespace) .map(|segment| { // 拆分片段末尾的连续空格 let word_part = segment.trim_end_matches(char::is_whitespace); let space_part = &segment[word_part.len()..]; // 仅反转单词部分,空格原封不动保留 let mut reversed_word: String = word_part.chars().rev().collect(); reversed_word.push_str(space_part); reversed_word }) .collect() } fn reverse_word(word: &str) -> String { word.chars().rev().collect() } fn main() { assert_eq!(reverse_words("apple"), "elppa"); assert_eq!(reverse_words("a b c d"), "a b c d"); assert_eq!(reverse_words("double spaced words"), "elbuod decaps sdrow"); }
实现说明
split_inclusive(char::is_whitespace)分割字符串时会将作为分隔符的空白字符包含在每个输出片段的末尾,不会丢失任何空格信息- 每个片段拆分出纯单词部分和末尾空格部分后,仅对单词部分做字符反转,空格部分完全保留原有长度和内容
- 最终拼接结果可以100%还原原字符串的空格结构,同时完成所有单词的字符反转,三个断言均可正常通过
内容的提问来源于stack exchange,提问作者user19199210
相关产品推荐
相关产品推荐

