First, please format the code in your post according to the pinned post, it makes it easier to read.
Second, the issue there seems to be that get_statistic()
takes stat
by value, and Statistic
does not implement Copy
. That means each call to get_statistic()
moves stat
into the function, so the closure key_fn
can only be called once, so it only implements FnOnce
. However, Vec::sort_by_key()
takes something that implements FnMut
, since it calls it repeatedly.
There are two options for solutions. One would be to add #[derive(Copy)]
to the Statistic
enum, since it is a very small and simple type. The other option, if Statistic
couldn't be made Copy
for some reason, would be to modify get_statistic()
to take a reference to stat
instead.
That code also seems to have the problem that it is using Vec
without specifying its generic parameter. The signature of start_sorting_thread()
should be:
fn start_sorting_thread(
mut cities: Vec<City>,
stat: Statistic,
) -> thread::JoinHandle<Vec<City>> {