Примитивный тип unit (единичный тип)

Тип (), также называемый "единичным" (unit).

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

Описание

() чаще всего встречается неявно:

  • Функции без указания возвращаемого типа (-> ...) неявно имеют тип возвращаемого значения ().

Эти функции эквивалентны:

#![allow(unused)]
fn main() {
fn long() -> () {}
fn short() {}
}

Использование точки с запятой ;

Точка с запятой ; может использоваться для отбрасывания результата выражения в конце блока, заставляя выражение (и, следовательно, блок) вычисляться в ().

Примеры

#![allow(unused)]
fn main() {
fn returns_i64() -> i64 {
    1i64
}

fn returns_unit() {
    1i64;  // Точка с запятой отбрасывает результат
}

let is_i64 = {
    returns_i64()  // Без точки с запятой - возвращает i64
};

let is_unit = {
    returns_i64();  // С точкой с запятой - возвращает ()
};
}

Реализации трейтов

Реализация Debug

МетодОписаниеВерсияПример
fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>Форматирует значение с помощью заданного форматировщика.1.0.0println!("{:?}", ()); // Выводит: ()

Реализация Default

МетодОписаниеКонстантностьВерсия
default() -> ()Возвращает значение по умолчанию для ().-1.0.0

Реализация Extend<()> для ()

МетодОписаниеВерсияСтатус
extend<T>(&mut self, iter: T)Расширяет коллекцию содержимым итератора.1.28.0Стабильный
extend_one(&mut self, _item: ())Расширяет коллекцию ровно одним элементом.NightlyЭкспериментальный
extend_reserve(&mut self, additional: usize)Резервирует ёмкость в коллекции для заданного количества дополнительных элементов.NightlyЭкспериментальный

Реализация FromIterator<()> для ()

МетодОписаниеВерсияПример
from_iter<I>(iter: I)Создаёт значение из итератора. Сворачивает все единичные элементы из итератора в один.1.23.0`let res: Result<()> = data.iter().map(

Реализация Hash

МетодОписаниеВерсия
hash<H>(&self, _state: &mut H)Подаёт это значение в заданный Hasher.1.0.0
hash_slice<H>(data: &[Self], state: &mut H)Подаёт срез этого типа в заданный Hasher.1.3.0

Реализация Ord

МетодОписаниеКонстантностьВерсия
cmp(&self, _other: &()) -> OrderingСравнивает self с other.-1.0.0
max(self, other: Self) -> SelfСравнивает и возвращает максимум двух значений.-1.21.0
min(self, other: Self) -> SelfСравнивает и возвращает минимум двух значений.-1.21.0
clamp(self, min: Self, max: Self) -> SelfОграничивает значение определённым интервалом.-1.50.0

Реализация PartialEq

МетодОписаниеКонстантностьВерсия
eq(&self, _other: &()) -> boolПроверяет равенство значений self и other.-1.0.0
ne(&self, _other: &()) -> boolПроверяет неравенство значений.-1.0.0

Реализация PartialOrd

МетодОписаниеКонстантностьВерсия
partial_cmp(&self, _: &()) -> Option<Ordering>Возвращает упорядочение между self и other, если оно существует.-1.0.0
lt(&self, other: &Rhs) -> boolПроверяет "меньше" (для self и other).-1.0.0
le(&self, other: &Rhs) -> boolПроверяет "меньше или равно" (для self и other).-1.0.0
gt(&self, other: &Rhs) -> boolПроверяет "больше" (для self и other).-1.0.0
ge(&self, other: &Rhs) -> boolПроверяет "больше или равно" (для self и other).-1.0.0

Реализация Termination

МетодОписаниеВерсия
report(self) -> ExitCodeВызывается для получения представления значения в виде кода завершения.1.61.0

Примеры использования

1. Функции без возвращаемого значения

#![allow(unused)]
fn main() {
fn print_hello() {
    println!("Hello!");
    // Неявно возвращает ()
}

fn explicit_return() -> () {
    println!("Explicit");
    // Явно возвращает ()
}
}

2. Отбрасывание результатов

#![allow(unused)]
fn main() {
let x = {
    let y = 5 + 3;
    y * 2  // Возвращает 16 (i32)
};

let unit = {
    let y = 5 + 3;
    y * 2;  // Точка с запятой отбрасывает результат, возвращает ()
};
}

3. Коллекции и итераторы

#![allow(unused)]
fn main() {
use std::io::*;

let data = vec![1, 2, 3, 4, 5];
// Собираем все результаты записи в единый Result<()>
let res: Result<()> = data.iter()
    .map(|x| writeln!(stdout(), "{x}"))
    .collect();
assert!(res.is_ok());
}

4. Паттерн-матчинг

#![allow(unused)]
fn main() {
fn process_result(result: Result<i32, String>) -> () {
    match result {
        Ok(value) => println!("Got value: {}", value),
        Err(error) => println!("Error: {}", error),
    }
}
}

Автоматические реализации трейтов

ТрейтОписание
FreezeТип можно безопасно замораживать.
RefUnwindSafeСсылки на этот тип безопасны при размотке стека.
SendЗначения этого типа можно безопасно передавать между потоками.
SyncСсылки на этот тип можно безопасно использовать из нескольких потоков одновременно.
UnpinЗначения этого типа можно безопасно перемещать.
UnwindSafeЗначения этого типа безопасны при размотке стека.

Специальные реализации

ТрейтОписаниеВерсия
ConstParamTy_Тип может использоваться как параметр константного типа.-
EqТип реализует отношение эквивалентности.1.0.0
StructuralPartialEqСтруктурное частичное равенство.-