Functions

So far, we have been modifying the main() function, but Rust lets us define as many functions as we need. In R, functions are objects created with <- function(). In Rust, they are declared with the fn keyword. Just like everything else in Rust, arguments are typed - each argument takes the form arg_name: type, and the return type is specified after ->.

fn name_of_function(arg1: ArgType) -> ReturnType {
    // function body
    my_return_object
}

As in R, the last expression in a function body is returned automatically — no explicit return keyword is needed unless you are returning early. Functions can also be declared anywhere in the file, outside of main().

Identifying whether a number is odd or even is a classic example. The is-odd npm package became famous for being a remarkably small and widely depended-upon piece of code:

Here is the Rust equivalent. We define is_even() first, taking an i32 and returning a bool, then use it inside is_odd():

fn is_even(x: i32) -> bool {
    x % 2 == 0
}

fn is_odd(x: i32) -> bool {
    !is_even(x)
}

Since x % 2 == 0 is an expression that evaluates to a bool, it is returned directly without a return statement. Building new functions from existing ones like this is idiomatic Rust.