Найти тему
Ржавый код

Изучение Rust - встроенные макросы

Когда-нибудь выходили из себя, набирая тот же старый код шаблона снова и снова? Заметили закономерность и бум! Rust может взорвать код для тебя!

Как разработчик программного обеспечения, я пишу заметное количество кода. Приятно печатать и видеть поток характеристик, проявляющих мои мысли. Однако мой мыслительный процесс имеет тенденцию двигаться быстрее, чем мои пальцы на клавиатуре. Чтобы устранить это несоответствие, я иногда ищу способы минимизировать ввод текста, сохраняя скорость мышления.

В эти моменты я могу распознать возможности оптимизации, такие как извлечение повторяющегося кода в выделенную функцию. Этот шаг не только уменьшает ввод, но и упрощает обслуживание кода. Когда это делается, это часто приносит чувство удовлетворения. Однако бывают случаи, когда этот процесс может быть компромиссом: извлеченный и обобщенный код мог бы работать медленнее, чем оригинал, оставляя меня желать оптимального баланса эффективности и производительности.

В отличие от Python, Java или C#, Rust позволяет создавать код с макросами во время компиляции. Что это значит? Это означает, что можно написать код, похожий на стандартный Rust, который затем будет расширен в другой код во время компиляции. Рассмотрим хорошо известный пример использования макроса `println!`:

-2

Код предназначен для печати одной конкатенированной строки. В таких языках, как Java, среда выполнения будет анализировать первый аргумент, создавать местозаполнитель, а затем заменять его во время печати. Этот процесс требует дополнительных циклов ЦП и может привести к сбою. Напротив, Rust анализирует такое форматирование во время компиляции и создает следующий эквивалентный код:

-3

В Rust такие макросы можно создать самостоятельно. Синтаксис трудно понять изначально, но крейт для вставки упрощает обучающую кривую. Рассмотрим пример, который включает значительный код шаблона:

-4

Код демонстрирует использование изменяемого объекта построителя, заполняющего его частные поля. Для каждого поля требуется новый метод, который выглядит идентично другим. Это можно улучшить, внедрив следующий метод для выполнения:

-5

Эта реализация имеет несколько недостатков, таких как использование `panic!` и отсутствие надежных проверок действительных идентификаторов. Однако с помощью макросов Rust можно обойти эти проблемы. Мы можем создать предыдущий подробный код, который проверяет идентификаторы и не прибегает к панике:

-6

Этот макрос берет список идентификаторов, разделенных запятыми, и генерирует соответствующий метод для каждого поля, ответственного за установку этого поля. Разве это не красивый подход?

Написание кода - это удовольствие, и генерация кода выводит это удовольствие на совершенно новый уровень. Можете ли вы видеть, что вы можете автоматизировать для дополнительной дозы радости в следующий раз?

Статья на rusty-code.ru