Перейти к основному содержимому
  1. Rust/

Псевдонимы типов в Rust или как сделать код понятнее

414 слов·2 минут· loading · loading · ·
Rust Dev
about-rust - Эта статья часть цикла.
Часть 9: Эта статья

Введение
#

Псевдонимы типов type aliases — это способ дать существующему типу альтернативное, более понятное имя (аналог никнейм).

Вместо того чтобы читать “i32”, вы сразу видите: это метры, это айдишник юзера или это цельсии. Такой подход делает код яснее, безопаснее и проще в сопровождении.

Пример
#

Представим, что вы пишете программу для спортивных соревнований. Вам нужно оперировать длиной трассы.

fn main() {
    let race_distance: i32 = 1600;
}

Rust по умолчанию определит тип i32 для переменной. Но 1600 чего? Метров, милей, cантиметров? Совсем неоднозначно.

Такое значение без контекста легко может привести к ошибке.

Используем псевдоним для типа i32.

type Meters = i32;

fn main() {
    let race_distance: Meters = 1600;
}

Теперь стало проще и из кода понятно: это метры.


Как объявить псевдоним для типа?
#

Синтаксис простой:

type NameAlias = Существующий_тип;
Старайтесь придерживаться именования CamelСase -> слова пишутся слитно без пробелов, при этом каждое слово внутри фразы пишется с прописной буквы

Повторное использование
#

Псевдонимы можно легко переиспользовать:

type Meters = i32;

fn main() {
    let race_one_distance: Meters = 1600;
    let race_two_distance: Meters = 3000;
}

Такой подход особенно полезен при работе с единицами измерения, координатами, идентификаторами и другими значениями, которые иначе были бы просто i32, u64, String и так далее.

Псевдонимы для сложных типов
#

Псевдонимы особенно удобны, когда у вас есть длинные или вложенные типы. Например, колбэки (функции обратного вызова в аргументах):

Без псевдонима
#

fn run_callback(cb: fn(i32) -> bool) {
    if cb(10) {
        println!("Callback returned true");
    }
}

С псевдонимом
#

type IntPredicate = fn(i32) -> bool;

fn run_callback(cb: IntPredicate) {
    if cb(10) {
        println!("Callback returned true");
    }
}

Теперь это читается гораздо проще.


Где еще удобно использовать псевдонимы?
#

Типы ошибок
#

type Result<T> = std::result::Result<T, MyError>;

Функции-обработчики обратного вызова (колбэки/callbacks)
#

type EventHandler = fn(Event) -> ();

При работе с деньгами
#

type Rubles = f64;
fn calculate_total(price: Rubles, discount: Rubles) -> Rubles {
    price - discount
}

Идентификаторы в веб-разработке
#

type UserId = String;
fn get_user(id: UserId) { ... }

Разработка игр
#

type HealthPoints = u32;
let player_health: HealthPoints = 100;

Важные моменты:

  • Не злоупотребляйте ими - если тип и так понятен (например, count: i32), псевдоним не нужен
  • Используйте там, где важно подчеркнуть смысл данных
  • Помните, что это просто переименование - компилятор всё равно видит исходный тип

Итог
#

Используйте алиасы типов везде, где базовый тип не раскрывает достаточного смысла или где повторяется сложная сигнатура.

В своей практике я почти в каждом языке встречал алиасы для типов и использовал их в работе, это полезная возможность.

about-rust - Эта статья часть цикла.
Часть 9: Эта статья

Связанные статьи

Создание и работа с константами в Rust
495 слов·3 минут· loading · loading
Rust Dev
Изменяемые и неизменяемые переменные в Rust
419 слов·2 минут· loading · loading
Rust Dev
Hash Map в Rust
733 слов·4 минут· loading · loading
Rust Dev