| # Higher Order Functions |
| |
| Rust provides Higher Order Functions (HOF). These are functions that |
| take one or more functions and/or produce a more useful function. HOFs |
| and lazy iterators give Rust its functional flavor. |
| |
| ```rust,editable |
| fn is_odd(n: u32) -> bool { |
| n % 2 == 1 |
| } |
| |
| fn main() { |
| println!("Find the sum of all the numbers with odd squares under 1000"); |
| let upper = 1000; |
| |
| // Imperative approach |
| // Declare accumulator variable |
| let mut acc = 0; |
| // Iterate: 0, 1, 2, ... to infinity |
| for n in 0.. { |
| // Square the number |
| let n_squared = n * n; |
| |
| if n_squared >= upper { |
| // Break loop if exceeded the upper limit |
| break; |
| } else if is_odd(n_squared) { |
| // Accumulate value, if it's odd |
| acc += n; |
| } |
| } |
| println!("imperative style: {}", acc); |
| |
| // Functional approach |
| let sum: u32 = |
| (0..).take_while(|&n| n * n < upper) // Below upper limit |
| .filter(|&n| is_odd(n * n)) // That are odd |
| .sum(); // Sum them |
| println!("functional style: {}", sum); |
| } |
| ``` |
| |
| [Option][option] |
| and |
| [Iterator][iter] |
| implement their fair share of HOFs. |
| |
| [option]: https://doc.rust-lang.org/core/option/enum.Option.html |
| [iter]: https://doc.rust-lang.org/core/iter/trait.Iterator.html |