Rust: что такое unit-подобные структуры? Определение, назначение и примеры

от автора

Что такое unit-подобные структуры Rust?

Unit-подобная структура (или “unit-like”, потому что она похожа на пустой кортеж (), иногда называемый “unit”) — это специальная структура на языке программирования Rust, которую мы объявляем без каких-либо полей. Определяется она с помощью ключевого слова struct, за которым следует имя unit-подобной структуры, а затем пара фигурных скобок без полей внутри, которые обычно опускаются при объявлении.

Синтаксис для определения unit-подобной структуры выглядит следующим образом:

struct NameOfUnitStruct;

Зачем нужны unit-подобные структуры?

Unit-подобные структуры часто используются в качестве плейсхолдеров (заполнителей) или меток (маркеров) для представления определенного типа или варианта, который не содержит никаких дополнительных данных. Они могут быть полезны в тех случаях, когда вы хотите определить тип, который может использоваться в определенном контексте, но не требует хранения какой-либо информации за пределами его существования.

Например, вы можете определить unit-подобную структуру с целью представления конкретного варианта перечисления или реализации трейта (типажа) для типа, который не требует дополнительных данных.

Примеры использования unit-подобных структур

Использование unit-подобных структур в качестве вариантов перечислений

Ниже приведен типичный пример того, как вы можете использовать unit-подобную структуру в качестве варианта в перечислении:

#[derive(Debug)] enum Animal {     Cat,     Dog,     Horse,     Mouse(String),     Rat, }  fn main() {     let mouse = Animal::Mouse(String::from("Jerry"));     let rat = Animal::Rat;      println!("{:?}", mouse);     println!("{:?}", rat); }

В этом примере вариант Mouse перечисления Animal определен принимающим строковый параметр, в то время как вариант Rat представляет собой unit-подобную структуру и не содержит никаких дополнительных данных.

Использование unit-подобных структур для реализации трейтов

Вы также можете использовать unit-подобные структуры для реализации трейтов для типов, не имеющих полей. Например, вы можете определить трейт с названием Show, который требует от типа реализацию метода show(), выводящего какую-либо информацию о типе в консоль:

trait Show {     fn show(&self); }  struct Point {     x: i32,     y: i32, }  impl Show for Point {     fn show(&self) {         println!("Point at ({}, {})", self.x, self.y);     } }  struct Line;  impl Show for Line {     fn show(&self) {         println!("Line");     } }  fn main() {     let point = Point { x: 3, y: 4 };     let line = Line;      point.show();     line.show(); }

В этом примере мы видим структуру Point, которая имеет два поля, x и y, и структуру Line, которая представляет из себя unit-подобную структуру без полей. Оба типа реализуют трейт Show и имеют метод show(), но реализация структуры Line не нуждается в доступе к каким-либо полям, ведь у этой структуры их нет.

Использование unit-подобных структур в качестве меток или плейсхолдеров

Unit-подобные структуры также могут вам пригодиться, когда вы хотите определить тип, имеющий определенное значение, но который не требует хранения каких-либо данных. Например, вы можете определить unit-подобную структуру, которая будет представлять конец потока данных или указать, что значение отсутствует или неизвестно.

struct EndOfStream;  fn main() {     let mut stream: Vec<Result<i32, EndOfStream>> =         vec![Ok(1), Ok(2), Ok(3), Ok(4), Ok(5), Err(EndOfStream)];      while let Some(x) = stream.pop() {         match x {             Ok(x) => println!("{}", x),             Err(_) => break,         }     } }

В этом примере stream определяется как вектор значений Result, где вариант Ok представляет целочисленное значение, а вариант Err представляет собой unit-подобную структуру EndOfStream. Цикл while let перебирает элементы вектора stream и прерывается, когда ему повстречается вариант Err, указывающий на конец потока.


Завтра состоится открытое занятие «Особенности языка Rust в примерах». На уроке рассмотрим примеры кода, демонстрирующие ключевые особенности, преимущества и недостатки языка. Записаться можно на странице онлайн-курса «Rust Developer».


ссылка на оригинал статьи https://habr.com/ru/company/otus/blog/713616/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *