Я изучаю ржавчину с помощью шорохов. Я пытался реализовать решение функциональным способом (шорохи просили только императивный способ). Я столкнулся со следующей ошибкой компилятора и не мог понять это с 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,
})
Ой! Я думаю, что мог перепутать возврат замыкания с возвратом функции.
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
на месте и ничего не возвращает.
Какова сигнатура функции
and_modify
? Кажется, что ваш обратный вызов ничего не вернет