У меня есть функция для перестановки символов в словах, и мне нужно знать, как преобразовать 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.
Вот версия вашего кода с минимальными изменениями, чтобы заставить его работать. В основном вам нужно только добавить .join(' ')
к вашему последнему утверждению:
fn reverse_words(words: &str) -> String {
let split = words.split_whitespace();
let vec: Vec<&str> = split.collect();
let mut vec2 = vec![];
for word in vec {
vec2.push(word.chars().rev().collect::<String>());
}
vec2.join(" ")
}
fn main() {
let sentence = "hello world";
assert_eq!(reverse_words(sentence), "olleh dlrow");
}
🔁 Детская площадка.
Однако это неэффективная реализация, требующая большого количества ресурсов. Вы можете связать методы трейта Iterator, чтобы получить решение, которое не требует такого большого распределения:
fn reverse_words(words: &str) -> String {
words
.split_whitespace()
.map(|w| w.chars().rev().chain([' ']))
.flatten()
.take(words.len())
.collect::<String>()
}
fn main() {
let sentence = "hello world";
assert_eq!(reverse_words(sentence), "olleh dlrow");
}
🔁 Детская площадка.
nit: вместо того, чтобы писать тесты в функции main
, вы могли бы добавить #[test]
и сделать их правильными тестами с описательным именем.
Ошибка довольно очевидна: вы пытаетесь вернуть целое
Vec<String>
(vec2
), когда тип возвращаемого значения — одинString
. Вы имеете в виду join(), а затем снова вместе?