Keyword fn

source ·
Expand description

A function or function pointer.

Functions are the primary way code is executed within Rust. Function blocks, usually just called functions, can be defined in a variety of different places and be assigned many different attributes and modifiers.

Standalone functions that just sit within a module not attached to anything else are common, but most functions will end up being inside impl blocks, either on another type itself, or as a trait impl for that type.

fn standalone_function() {
    // code
}

pub fn public_thing(argument: bool) -> String {
    // code
}

struct Thing {
    foo: i32,
}

impl Thing {
    pub fn new() -> Self {
        Self {
            foo: 42,
        }
    }
}
Run

In addition to presenting fixed types in the form of fn name(arg: type, ..) -> return_type, functions can also declare a list of type parameters along with trait bounds that they fall into.

fn generic_function<T: Clone>(x: T) -> (T, T, T) {
    (x.clone(), x.clone(), x.clone())
}

fn generic_where<T>(x: T) -> T
    where T: std::ops::Add<Output = T> + Copy
{
    x + x + x
}
Run

Declaring trait bounds in the angle brackets is functionally identical to using a where clause. It’s up to the programmer to decide which works better in each situation, but where tends to be better when things get longer than one line.

Along with being made public via pub, fn can also have an extern added for use in FFI.

For more information on the various types of functions and how they’re used, consult the Rust book or the Reference.