Chapter 14. Closures
Save the environment! Create a closure today!
Cormac Flanagan
Sorting a vector of integers is easy.
integers.sort();
It is, therefore, a sad fact that when we want some data sorted, it’s hardly ever a vector of integers. We typically have records of some kind, and the built-in sort method typically does not work:
structCity{name:String,population:i64,country:String,...}fnsort_cities(cities:&mutVec<City>){cities.sort();// error: how do you want them sorted?}
Rust complains that City does not implement std::cmp::Ord. We need to specify the sort order, like this:
/// Helper function for sorting cities by population.fncity_population_descending(city:&City)->i64{-city.population}fnsort_cities(cities:&mutVec<City>){cities.sort_by_key(city_population_descending);// ok}
The helper function, city_population_descending, takes a City record and extracts the key, the field by which we want to sort our data. (It returns a negative number because sort arranges numbers in increasing order, and we want decreasing order: the most populous city first.) The sort_by_key method takes this key-function as a parameter.
This works fine, but it’s more concise to write the helper function as a closure, an anonymous function expression:
fnsort_cities(cities:&mutVec<City>){cities.sort_by_key(|city|-city.population);}
The closure here is |city| -city.population. It takes an argument city and returns -city.population. Rust infers the ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access