Код макроса для rust

Обновлено: 04.07.2024

Как-то я сказал своему коллеге, что в Rust имеются макросы, ему показалось, что это плохо. Раньше у меня была такая же реакция, но Rust показал мне, что макросы не обязательно плохи.

Где и как их уместно применять? Смотрите под катом.

Типо-безопасная работа с форматом строк

Во многих языках программирования поддерживается задание форматов вывода для строк -4-. Rust не является исключением и также поддерживает задание форматов строк посредством format! . Однако по-прежнему стоит вопрос: почему мы должны использовать метапрограммирование для решения проблемы? Давайте посмотрим на println! (он внутри использует format! для обработки переданной строки) -5-.

Есть много причин того, что format! реализован как макрос -6-, я же хочу подчеркнуть то, что он может разделить строку на части во время компиляции, проанализировать ее и проверить, является ли обработка переданных аргументов типо-безопасной. Мы можем изменить наш код и получить ошибку компиляции:

Во многих других языках данные ошибки проявились бы во время выполнения, однако в Rust мы можем использовать макросы для того, чтобы выполнять данную проверку на этапе компиляции и генерировать производительный код для обработки формата строки без проверок времени выполнения -7-.

Легкое логирование

В этом примере немного вдадимся в экосистему языка. Rust имеет пакет log, который используется как главный фронтенд логирования. Как и другие решения для логирования, он предоставляет разные уровни логирования, но, в отличие от других решений, данные уровни представляются макросами, а не функциями.

Логирование показывает мощность метапрограммирования в том, как оно использует макросы file! и line! ; Данные макросы дают возможность установить точное место расположения вызова функции логирования в исходном коде. Давайте посмотрим на пример. Так как log является фронтендом, добавим бэкенд, пакет flexi_logger.

Эта программа напечатает:

Как вы видите, наши логи содержат имена файлов и номера строк.

  • мы получаем данную информацию без накладных расходов времени выполнения на получение этих данных.
  • информация корректна и полезна.

В первом случае компилятор вставляет в исполняемые файлы необходимую информацию, которую мы можем при необходимости напечатать. Если бы мы не решали данную проблемы во время компиляции, то нам пришлось мы исследовать стек во время выполнения, что чревато ошибками и снижает производительность.

Если мы заменим логирующие макросы на функции, то по-прежнему можем вызывать file! и line! :

А данный код вывел бы следующее:

Почему функциональные макросы

Функциональный макрос может быть исполнен почти как функция. Данный вид макросов имеет ! в вызове:

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

Выводы

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

На этой странице вы можете скачать абсолютно бесплатно готовые макросы и скрипты для «Rust». Установка макроса на обычную клавиатуру и мышку происходит в два клика.

Категория: База макросов и скриптов » Rust

Наименование

ak47 norecoil 0.66 FOV 90

жмёт почти идеально в точку, настраивал под FOV 90, input.sensitivity 0.66 . ..

11.10.2021 08:51:21

Ak47____8X

Имбовый макрос для 8x который может попадать на 200+метров Он убирает отдачу по..

Shadow5111

01.10.2021 22:39:27

ak47 norecoil 0.66 FOV 90

мой первый макрос, жмёт почти идеально в точку, настраивал под FOV 90, input.sen..

28.09.2021 01:54:25

ak47.long.dist

Макросс создал сам, Макросс рассчитан на калаш без обвессов, Макросс хорошо о..

27.09.2021 21:36:24

ak-47 for 8x

Макрос для Ак-47 с прицелом 8х, использовать макрос с драйвером для более стабил..

ChymnoyDoctor

26.09.2021 22:35:09

AK-47_no_recoil

Этот макрос позволит вам стрелять практически без отдачи. Для этого макроса нужн..

26.09.2021 14:55:10

default ak-47 strong

Макрос для сенсы 0.66 и Fov 90, нужно немного жать с макросом Макрос нужно испо..

ChymnoyDoctor

25.09.2021 18:43:33

Заходите в редактор A4tech ставите любую кнопку,ваш макрос работает, Слив макр..

07.09.2021 13:07:40

Лучший макрос АК-47 от VAUSE Работает ТОЛЬКО с 8X Настройки : FOV 75 - ..

06.09.2021 22:34:29

Лучший макрос АК-47 от VAUSE Работает ТОЛЬКО с 8X Настройки : FOV 75 - ..

06.09.2021 22:34:08

AK47 - IRON

Лучший макрос АК-47 от VAUSE Работает с голографическим прицелом и железным п..

06.09.2021 11:59:12

Настройки в игре: - FOV 90 - Чувствительность 0.66 Настройки в программе: 1..

05.09.2021 01:13:09

пулемет м249

макрос для М249! довольно хорошо работает и на 8х сенса 0.5 в точку Советую, ..

dimasikzloy228

29.08.2021 21:40:23

Калашик by Djem ;3

Макрос на АК без прицела,тупо by Djem,мужики пользуйтесь :3 У макроса полностью..

25.08.2021 17:33:23

Томик(Легит) by Djem

Очень крутой макрос на Томпсон. Проверенно лично мной,проверял на таких сервера..

20.08.2021 15:56:40

Томик by Djem

Максро для томсона, отдачи 0 стрельба в точку. Sens 0.4-0.5 Установка. 1.Наж..

20.08.2021 15:56:25

Sens 1. Приватный макрос для AK-47. Работает на любой мишке при настройках сенса..

IdontFeelHurt

18.08.2021 12:36:32

Макрос для калаша, почти вырубет отдачу)

Sens 1 fov 75 Зажим почти в точку. Приятной игры ))))))))))))))))))))))))..

POWERGRIND

11.08.2021 22:44:01

AK-47 Мушка

Настройки в игре: - FOV 90 - Чувствительность 0.66 Настройки в программе: 1..

09.08.2021 13:53:18

MP5 - HOLO + IRON

Best MP5 Macro by ноунейм999666228 Works with Iron Sights and Holograpic S..

noyneim228999666

08.08.2021 18:15:43

AK - 47 [0positive] 0.66 Sens FOV 90

Хороший макрос на оружие АК - 47. Жмет в точку до 140 метров отдача рандом. Н..

Derive с преимуществами

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

Наиболее выдающимся случаем использования на текущий момент является Rocket — библиотека для написания веб-серверов. Создание REST-endpoint'ов требует добавления атрибута к функции, так что теперь функция содержит всю необходимую информацию для обработки запроса.

Если вы работали с веб-библиотеками в других языка (например, Flask или Spring), то данный стиль для вас, вероятно, не нов. Я не буду здесь сравнивать эти библиотеки, отмечу лишь, что вы можете писать подобный код и в Rust, пользуясь его преимуществами (высокая производительность получаемого нативного кода и т. д.) -11-.

Недостатки

Макросы не идеальны, рассмотрим их некоторые недостатки:

Получение избыточного кода (boilerplate)

Атрибут derive используется в Rust для генерации реализации типажей. Давайте посмотрим на PartialEq .

Здесь мы создаем структуру, экземпляры которой хотим проверять на равенство ( использовать == ), поэтому мы получаем реализацию PartialEq -9-. Мы могли бы реализовать PartialEq самостоятельно, но наша реализация была бы тривиальной, ибо мы хотим только проверять объекты на равенство:

Данный код также генерирует нам компилятор, так что использование макроса экономит нам время, однако, что важнее, избавляет нас от необходимости поддержки проверяющего на равенство кода в актуальном состоянии. Если мы добавим поле в структуру, нам нужно изменить проверку в нашей ручной реализации PartialEq , иначе (например, если мы забудем изменить код проверки) проверка разных объектов может пройти успешно.

Избавление от бремени поддержки является большим преимуществом, который предоставляет нам атрибутный макрос. Мы написали код структуры в одном месте и автоматически получили реализацию функции проверки и гарантии времени компиляции того, что код проверки соответствует текущему определению структуры. Ярким примером сказанного является пакет serde, используемый для сериализации данных, и без макросов нам необходимо было бы использовать строки для указания serde на названия полей структур, поддерживая эти строки в актуальном состоянии относительно определения структуры -10-.

Почему атрибутные макросы

Rust включает в себя концепт атрибутов, который нужен для пометки кода. Например, функция тестирования выглядит так:

Запуск cargo test запустит данную функцию. Атрибутивные макросы позволяют вам создавать новые атрибуты, который подобны "родным" атрибутам, но имеют другие эффекты. На текущий момент существует важное ограничение: в компиляторе из ветки stable работают только макросы использующие атрибут derive, в то время как пользовательские атрибуты работают в ночных сборках. Рассмотрим разницу ниже.

Рассматривая преимущества, даваемые атрибутивными макросами, целесообразно сравнить код, который может манипулировать исходным кодом, с тем, который не может это делать.

Полезные утверждения

О макросах в Rust

Многие их этих проблем могут быть решены при использовании необходимых средств, макросы же предоставляют некоторые такие средства:

  • генерирование избыточного/тривиального кода (boilerplate) вместо его ручного написания.
  • расширение языка перед тем, как будет добавлен новый синтаксис, закрытие пробелов в языке.
  • оптимизация производительности — ибо некоторые действия, которые ранее выполнялись во время исполнения, теперь исполняются на стадии компиляции -1-.

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

Причиной того, что имеется два типа макросов является то, что они хорошо подходят для решения разных задач:

  • функциональные: легко включить в код.
  • атрибутные: лучше подходят для генерации кода, который не вписывается в окружающий код.

Во всем остальном результаты их применения схожи: компилятор "стирает" макросы во время компиляции, заменяя их кодом, генерирующимся из макроса, и компилируя его с "обычным", не макро-кодом -3-. Реализация двух типов макросов сильно отличается, но мы не будет здесь глубоко в это вдаваться.

Читайте также: