Rust单词反转函数报错:如何将Vec<&String>转为带空格的String?
问题描述
编写了一个用于反转单词内字符的Rust函数,遇到类型不匹配编译错误:函数预期返回String类型,但实际返回了Vec<&String>类型。需要了解如何将Vec<&String>转换为带有空格分隔的自有String。
原函数代码:
fn reverse_words(words: &str) -> String { let mut split = words.split_whitespace(); let vec: Vec<&str> = split.collect(); let vec2 = vec!(); for word in vec { vec2.push(&word.chars().rev().collect::<String>()); } return vec2; }
编译错误信息:
error[E0308]: mismatched types --> src/lib.rs:8:12 | 1 | fn reverse_words(words: &str) -> String { | ------ expected `String` because of return type ... 8 | return vec2; | ^^^^ expected struct `String`, found struct `Vec` | = note: expected struct `String` found struct `Vec<&String>` For more information about this error, try `rustc --explain E0308`. error: could not compile `challenge` due to previous error NOTE: Line numbers in error messages can be incorrect due to concatenation.
解决方案
问题根源
- 函数声明返回
String,但实际返回的是Vec<&String>,类型完全不匹配。 - 代码中
vec2.push(&word.chars().rev().collect::<String>())存在临时值引用问题:collect::<String>()生成的是临时字符串,存储的引用会在循环结束后变成悬垂引用,即使类型匹配也会触发生命周期错误。
修复步骤
- 直接迭代
split_whitespace()的结果,无需先收集到Vec<&str>,简化代码结构。 - 反转每个单词时直接生成拥有所有权的
String,而非引用,收集到Vec<String>中。 - 使用
join(" ")方法将Vec<String>拼接成以空格分隔的单个String,匹配函数返回类型。
修正后的代码
fn reverse_words(words: &str) -> String { words.split_whitespace() .map(|word| word.chars().rev().collect::<String>()) .collect::<Vec<_>>() .join(" ") }
简化写法(利用类型推导)
Rust的类型推导可以自动识别类型,代码可进一步简化:
fn reverse_words(words: &str) -> String { words.split_whitespace() .map(|word| word.chars().rev().collect()) .collect::<Vec<_>>() .join(" ") }
验证示例
调用reverse_words("hello world")会返回"olleh dlrow",符合预期。
内容的提问来源于stack exchange,提问作者djd
相关产品推荐
相关产品推荐

