Фу

Функції у Rust

1 вправа

Про концепцію Функції

Функції - це тіла коду, які містять одну або більше інструкцій чи виразів. Функція може за бажанням повертати значення.

У стилі Rust назву функції пишуть у зміїному регістрі, а саме визначення функції починається з ключового слова fn. Наприклад

fn do_nothing() {}

Дужки охоплюють нуль або більше параметрів, розділених комами. Параметр - це привʼязка до значення певного типу, яке передають у функцію. Навіть якщо параметрів немає, дужки у визначенні функції все одно потрібні. Фактичне значення, яке передають параметру, називається аргументом.

Поєднання параметрів і поверненого значення називають сигнатурою функції. Сигнатура функції вимагає, щоб у кожного параметра було зазначено його тип.

Фігурні дужки охоплюють тіло функції: її інструкції та вирази. Навіть якщо функція не містить жодної інструкції чи виразу, фігурні дужки у визначенні функції все одно потрібні.

У наступному прикладі функція приймає один параметр типу i32, привʼязує його до назви value і друкує його.

fn print_integer(value: i32) {
    println!("{value:?}");
}

Звернімо увагу на визначення параметра. Кожен параметр визначають у форматі name: Type.

Функція також може повертати значення. Типово повертається результат останнього виразу. У наступному прикладі функція має один параметр i32 і повертає його подвоєне значення.

fn double_integer(value: i32) -> i32 {
    value * 2
}

Запис -> i32 указує, що функція повертає i32. На відміну від параметрів, повернене значення не має назви.

З функції можна вийти достроково за допомогою ключового слова return, ось так:

fn long_function() -> i32 {
    let some_condition = false;
    // code snipped
    if (some_condition) {
        return 0;
    }
    // more code snipped
    42
}

const fn використовують для визначення константної функції, яку можна обчислити під час компіляції.

const fn compute_data_checksum() -> u128 {
  const DATA: &[u8] = include_bytes!("my_big_data_file");
  // checksum implementation is left as an exercise for the reader
}

/// This checksum is used to validate that the user has not tampered with proprietary configuration.
pub const DATA_CHECKSUM: u128 = compute_data_checksum();

Оскільки константні функції можуть обчислюватися під час компіляції, вони мають деякі обмеження, яких не мають звичайні функції. Зокрема, const fn може викликати лише інші функції, також позначені як const. Недотримання цього обмеження призведе до помилки компіляції.

const fn multiply_integer(value: i32) -> i32 {
    use std::time::SystemTime;
    if SystemTime::now().elapsed().unwrap().as_nanos() == 0 { // this line errors
        value * 2
    } else {
        value * 3
    }
}

Існують анонімні функції, які розглядаються в темі closures.

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці