Rust Macros – انجمن DEV
در این پست وبلاگ، اجازه دهید نحوه کار با آن را با جزئیات بیشتری بررسی کنیم Macros
در Rust
ماکروها چیست؟
ماکروها روشی برای نوشتن کد هستند که کدهای دیگری را می نویسند که به آن معروف است فرابرنامه نویسی
فرابرنامهنویسی برای کاهش مقدار کدی که مینویسید و نگهداری میکنید مفید است که یکی از نقشهای توابع نیز میباشد. با این حال، ماکروها دارای برخی از قدرت های اضافی هستند که عملکردها ندارند.
انواع ماکروها
دو نوع ماکرو وجود دارد: اعلامی و رویه ای
ماکروهای اعلامی
بیشترین استفاده از ماکروها در Rust است. همچنین به عنوان “ماکروها به عنوان مثال”، “macro_rules! ماکرو». به شما امکان میدهد چیزی شبیه به مطابقت بنویسید
برای تعریف ماکرو از macro_rules استفاده می کنیم! ساختن. ما استفاده می کنیم #[macro_export] حاشیه نویسی نشان می دهد که این ماکرو باید هر زمان که جعبه ای که ماکرو در آن تعریف شده است در دسترس قرار گیرد.
نحو ماکروهای اعلانی
#[macro_export]
macro_rules! <name of macro> {
( $( $x:expr ),* ) => {
{
<implementation>
}
};
}
ماکروهای رویه ای
بیشتر شبیه یک تابع عمل می کند (و نوعی رویه است)
مقداری کد را به عنوان ورودی میپذیرد، روی آن کد عمل میکند و به جای تطبیق با الگوها و جایگزینی کد با کدهای دیگر، مانند ماکروهای اعلامی، مقداری کد را به عنوان خروجی تولید میکند.
سه نوع ماکرو رویه ای:
استخراج
ماکروهای مشتق ورودیهای جدیدی را برای ویژگی مشتق تعریف میکنند. این ماکروها می توانند آیتم های جدیدی را با توجه به جریان توکن ساختار، enum یا اتحادیه ایجاد کنند. آنها همچنین می توانند ویژگی های کمک کننده کلان را استخراج کنند.
استخراج نحو ماکرو رویه ای
extern crate proc_macro;
use proc_macro::TokenStream;
#[proc_macro_derive(<Name of Derive Macro>)]
pub fn derive_macro(_item: TokenStream) -> TokenStream {
<Implementation>
}
صفت مانند
ماکروهای مشخصه ویژگیهای بیرونی جدیدی را تعریف میکنند که میتوانند به آیتمها متصل شوند، از جمله آیتمهای موجود در بلوکهای خارجی، پیادهسازی ذاتی و صفت، و تعاریف ویژگی.
نحو ماکرو رویه ای ویژگی
extern crate proc_macro;
use proc_macro::TokenStream;
#[proc_macro_attribute]
pub fn <Attribute Name>(_attr: TokenStream, item: TokenStream) -> TokenStream {
<Implementation>
}
عملکرد مانند
ماکروهای رویه ای تابع مانند، ماکروهای رویه ای هستند که با استفاده از عملگر فراخوانی کلان (!) فراخوانی می شوند.
نحو عملکردی ماکروهای رویه ای
extern crate proc_macro;
use proc_macro::TokenStream;
#[proc_macro]
pub fn <Macro Name>(_item: TokenStream) -> TokenStream {
<Implementation>
}
ماکروها در مقابل توابع
پیاده سازی ماکروها نسبت به تعاریف تابع پیچیده تر است زیرا ما در حال نوشتن کد Rust هستیم که کد Rust را می نویسد.
معمولاً خواندن، درک و نگهداری تعاریف کلان نسبت به تعاریف تابع دشوارتر است
ماکروها باید ابتدا تعریف کنند یا قبل از فراخوانی یک فایل، آنها را در محدوده قرار دهند، برخلاف توابعی که میتوانید در هر جایی تعریف کنید و در هر مکانی فراخوانی کنید.
لطفا در صورت وجود نظرات خود را به اشتراک بگذارید
خواندن مبارک!!!