Шорохи: hashmap3.rs ожидал `()`, нашел структуру `Team`

Я изучаю ржавчину с помощью шорохов. Я пытался реализовать решение функциональным способом (шорохи просили только императивный способ). Я столкнулся со следующей ошибкой компилятора и не мог понять это с 2 часов. Пожалуйста помоги

Ошибка компилятора:

Progress: [############################>-------------------------------] 45/94
! Compiling of exercises/hashmaps/hashmaps3.rs failed! Please try again. Here's the output:
error[E0308]: mismatched types
  --> exercises/hashmaps/hashmaps3.rs:94:28
   |
94 |           .and_modify(|team| Team {
   |  ____________________________^
95 | |             name: team.name.to_string(),
96 | |             goals_scored: team.goals_scored+team_from_iter.goals_scored,
97 | |             goals_conceded: team.goals_conceded+team_from_iter.goals_conceded,
98 | |         })
   | |_________^ expected `()`, found struct `Team`       

error: aborting due to previous error

For more information about this error, try `rustc --explain E0308`. 

Код

Это набор строк, с которыми у компилятора возникла проблема.

.and_modify(|team| Team {
    name: team.name.to_string(),
    goals_scored: team.goals_scored+team_from_iter.goals_scored,
    goals_conceded: team.goals_conceded+team_from_iter.goals_conceded,
})

Ссылка на репозиторий с полным кодом:

  1. К точным строкам с проблемой: https://github.com/dheerajbhaskar/learn-rust-rustlings-PUBLIC/blob/a3d38c643fc178f05a847e7cb8016a784b0a54ac/exercises/hashmaps/hashmaps3.rs#L94-L98
  2. В репозиторий: https://github.com/dheerajbhaskar/learn-rust-rustlings-PUBLIC

Дополнительная информация

  1. Я написал очень похожий код в строке 119, который компилирует и проходит тесты. Я не мог понять, почему это сработало, но код в строке 94 выше не сработал. Редактировать: похоже, что у меня теперь ошибка компилятора в обеих этих строках ¯\_(ツ)_/¯
  2. Я нуб в ржавчине, если это еще не очевидно :)

Какова сигнатура функции and_modify? Кажется, что ваш обратный вызов ничего не вернет

mousetail 21.12.2022 09:03

Ой! Я думаю, что мог перепутать возврат замыкания с возвратом функции.

Dheeraj Bhaskar 21.12.2022 09:18
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
2
101
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
pub fn and_modify<F>(self, f: F) -> Self
where
    F: FnOnce(&mut V),

Аргумент and_modify имеет тип FnOnce(&mut V). Это функция, которая принимает один аргумент типа &mut V и ничего не возвращает. (Если бы он что-то возвращал, у него была бы подпись вроде FnOnce(&V) -> V.)

Конкретно, вы получаете изменяемый объект Team, который уже находится в хэш-карте, и вы должны изменить его на месте. Вместо того, чтобы создавать совершенно новую Team, вы должны обновить команду, которую вы пропускаете. Что-то вроде этого, скажем:

.and_modify(|team| {
    team.goals_scored += team_from_iter.goals_scored;
    team.goals_conceded += team_from_iter.goals_conceded;
})

Обратите внимание, как это изменяет team на месте и ничего не возвращает.

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