struct D; // unit struct
Это обычный способ написать нулевой размер struct
.
struct A{} // empty struct / empty braced struct
struct B(); // empty tuple struct
Это просто особые случаи базовых struct
и кортежей struct
, которые не имеют параметров. RFC 1506 объясняет рациональное разрешение для тех (они не привыкли):
Разрешить структуры кортежей и варианты кортежей с 0 полями. Это ограничение является искусственным и может быть снято тривиально. Авторы макросов, имеющие дело со структурами / вариантами кортежей, будут рады избавиться от этого особого случая.
Как таковые, они могут легко генерироваться макросами, но люди редко пишут их самостоятельно.
struct C(()); // unit-valued tuple struct
Это еще один особый случай кортежа struct
. В Rust ()
- это тип, как и любой другой тип, поэтому struct C(());
не сильно отличается от struct E(u32);
. Хотя сам тип не очень полезен, запрет на него может привести к еще одному особому случаю, который должен быть обработан в макросах или обобщенных типах (например, struct F<T>(T)
можно создать как F<()>
).
Обратите внимание, что есть много других способов иметь пустые типы в Rust. Например. можно получить функцию, возвращающую Result<(), !>
, чтобы указать, что она не выдает значение и не может завершиться ошибкой. Хотя вы можете подумать, что возвращение ()
в этом случае было бы лучше, вы могли бы иметь , чтобы сделать это, если вы реализуете черту, которая требует от вас возвращать Result<T, E>
, но позволяет вам выбрать T = ()
и E = !
.