Funções

As funções são declaras usando a palavra-chave fn. Os seus argumentos têm os tipos anotados, tal como as variáveis, e se a função retornar um valor, o tipo de retorno de ser especificado depois duma flecha (ou seta) ->.

A expressão final numa função será usada como valor de retorno. Alternativamente, a declaração de return pode ser usada para retornar um valor mais cedo a partir de dentro da função, até mesmo a partir de dentro dos laços de repetição ou declarações de if.

Vamos reescrever o FizzBuzz usando funções!:

// Diferente de C e C++,
// não existe restrição sobre a ordem de definições de função
fn main() {
    // Nós podemos usar esta função,
    // e defini-la em algum lugar depois
    fizzbuzz_to(100);
}

// Função que retorna um valor booleano
fn is_divisible_by(lhs: u32, rhs: u32) -> bool {
    // Caso extremo, retornar prematuramente
    if rhs == 0 {
        return false;
    }

    // Isto é uma expressão,
    // a palavra-chave `return` não é necessária
    lhs % rhs == 0
}

// As funções que "não" retornam um valor,
// na realidade retornam o tipo unitário `()`
fn fizzbuzz(n: u32) -> () {
    if is_divisible_by(n, 15) {
        println!("fizzbuzz");
    } else if is_divisible_by(n, 3) {
        println!("fizz");
    } else if is_divisible_by(n, 5) {
        println!("buzz");
    } else {
        println!("{}", n);
    }
}

// Quando uma função retornar `()`,
// o tipo de retorno pode ser omitido da assinatura
fn fizzbuzz_to(n: u32) {
    for n in 1..=n {
        fizzbuzz(n);
    }
}