Ожидаемая структура `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.

Ошибка довольно очевидна: вы пытаетесь вернуть целое Vec<String> (vec2), когда тип возвращаемого значения — один String. Вы имеете в виду join(), а затем снова вместе?

tadman 19.02.2023 04:36
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
2
1
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот версия вашего кода с минимальными изменениями, чтобы заставить его работать. В основном вам нужно только добавить .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] и сделать их правильными тестами с описательным именем.

cafce25 19.02.2023 11:42

Другие вопросы по теме