
Почему Go и Rust не враги, а друзья

Мультипарадигмальный компилируемый язык
Реализации C++ подчиняются принципу нулевой стоимости: ты не платишь за то, что не используешь [Страуструп, 1994]. Более того: то, что ты используешь, кодируется наилучшим образом.
– Бьёрн Страуструп
Одной из основных целей проекта Rust является безопасное системное программирование. Эта область обычно подразумевает императивную парадигму, что означает присутствие побочных эффектов, необходимость думать о разделяемом состоянии, и т.д. Для того, чтобы в таких условиях можно было обеспечить безопасность, программы и типы данных на Rust должны быть структурированы таким образом, чтобы их можно было статически проверить. Элементы и ограничения языка Rust совместно облегчают написание программ, проходящих эти проверки и, таким образом, обеспечивают безопасность. Например, в Rust глубоко интегрирована концепция владениям данными.
Выражение match
— это специальная конструкция, в которой эти особенности и ограничения сочетаются интересным образом. match
-выражение принимает входное значение, классифицирует его и затем передаёт выполнение коду, который обрабатывает соответствующий класс данных.
В этой статье мы рассмотрим, как работает match
в Rust. Вот основные элементы, которые match
и его дополнение, enum
, объединяют в единое целое:
switch
в C или Java.match
гарантирует, что ни один вариант не пропущен.match
поддерживает и императивный, и функциональный стили: вы можете и дальше использовать оператор break
, присваивания и прочее, и вам совершенно не нужно переучиваться на стиль, основанный на выражениях;match
умеет как «заимствовать», так и «перемещать»: Rust поощряет программиста думать о владении и заимствовании данных. Выражение match
спроектировано в том числе с возможностью только заимствования части структуры вместо её перемещения. Это нужно для того, чтобы не передать право владения какими-либо данными раньше, чем нужно.Мы рассмотрим каждый из этих пунктов по отдельности ниже, но для начала нам следует заложить фундамент дальнейшего обсуждения — как match
выглядит и работает?
try!
и типа Result
, до неопределённого момента после первого релиза языка программирования Rust.Result { Ok(value), Err(why) }
и макрос try!
. Тип Result
представляет из себя перечисление (enum), похожее на Option { Some(value), None }
и связанное с ним по смыслу. Вариант None
типа Option
говорит об отстутствии значения, а вариант Err(why)
типа Result
уточняет, почему значение отсутствует.Result
из функций, чтобы передавать значение возврата или причину, по которой значение вернуть не удалось. Макрос try!
в свою очередь позволяет автоматически возвращать Err(why)
из текущей функции, если вызов другой функции не удался (применяется к объекту типа Result
).