@@ -75,4 +75,71 @@ makrolar dahil isimlendirmelerde fonksiyon adı ! işareti ile sonlandırılır.
7575 bloğunun üretimi sağlanır.
7676- ($x: expr , $($y: expr ),+) => { ... } : Bu kalıpsa iki veya daha fazla argüman için geçerlidir. İkinci söz diziminde yer
7777 alan + operaötörü en az bir veya daha fazla anlamındadır. Bu durumla karşılaşılması halinde recursive olarak kendisini
78- çağıran bir fonksiyon kodu üretilecektir.
78+ çağıran bir fonksiyon kodu üretilecektir.
79+
80+ ## MetaSyntactic Variables
81+
82+ Makrolarda ifadeleri analiz etmek ve eşleşmeleri yakalamak için token'lar kullanılır. Bunlardan en çok kullanılanlar
83+ aşağıdaki tabloda belirtilmektedir.
84+
85+ | Token | Açıklama | Örnek |
86+ | -----------| -----------------------------------------------------------------------| ---------------------------------------------------|
87+ | ` ident ` | Değişken, fonksiyon, struct adı gibi tanımlayıcıyıları temsil edir | ` User ` , ` my_function ` , ` x ` |
88+ | ` ty ` | Belirli bir türü temsil eder _ (örneğin, ` f32 ` , ` String ` , ` Vec<i32> ` )_ | ` f32 ` , ` String ` , ` Option<T> ` |
89+ | ` expr ` | Bir expression anlamına gelir. | ` 5 + 4 ` , ` "hello world" ` , ` vec![1, 2, 3, 4, 10] ` |
90+ | ` stmt ` | Bir ifade ya da bildirim anlamına gelir. | ` let range = 50; ` , ` return 3.14; ` |
91+ | ` path ` | Modül ya da tür yolu için kullanılır | ` std::io::Read ` , ` crate::module::function ` |
92+ | ` literal ` | Sabit değer anlamına gelir (string, sayı, boolean). | ` 23 ` , ` "rustacean" ` , ` false ` |
93+ | ` block ` | ` {} ` bloğunu temsil eder. | ` { let x = 10; x + 1 } ` |
94+ | ` item ` | struct, enum, fn gibi enstrümanları temsil eder. | ` struct Product; ` , ` fn send_email() {} ` |
95+ | ` meta ` | Bir attribute' u temsil eder. | ` #[derive(Debug)] ` , ` #[cfg(target_os = "linux")] ` |
96+ | ` tt ` | Herhangi bir "token tree" ağacını temsil eder. | Herhangi bir Rust kodu parçası olabilir |
97+
98+ ## Örnekler
99+
100+ Aşağıdaki kod parçalarında farklı senaryoların ele alındığı procedural makrolar yer almaktadır. İlk örnek bir model
101+ nesnesi için gerekli struct'ı kolayca oluşturmak için kullanılır.
102+
103+ ``` rust
104+ macro_rules! crud {
105+ ($ struct_name : ident , $ ($ field_name : ident : $ field_type : ty ),* ) => {
106+ #[derive(Debug )]
107+ struct $ struct_name {
108+ $ (
109+ $ field_name : $ field_type ,
110+ )*
111+ }
112+
113+ impl $ struct_name {
114+ fn new ($ ($ field_name : $ field_type ),* ) -> $ struct_name {
115+ $ struct_name { $ ($ field_name ),* }
116+ }
117+ }
118+ };
119+ }
120+
121+ crud! (Product , id : i32 ,title : String ,list_price : f32 ,category : String );
122+
123+ #[cfg(test)]
124+ mod tests {
125+ use super :: * ;
126+ #[test]
127+ fn test_crud_macro () {
128+ let c64 = Product :: new (
129+ 1 ,
130+ " C64 monitor 14.1inch" . to_string (),
131+ 999.99 ,
132+ " Retro Computer" . to_string (),
133+ );
134+ assert_eq! (c64 . id, 1 );
135+ assert_eq! (c64 . title, " C64 monitor 14.1inch" . to_string ());
136+ assert_eq! (c64 . list_price, 999.99 );
137+ assert_eq! (c64 . category, " Retro Computer" . to_string ());
138+ }
139+ }
140+ ```
141+
142+ Örneğin Product, Customer, Order, Category ve benzeri entity nesnelerinin yer aldığı bir senaryoda her birisi için ayrı
143+ ayrı struct geliştirmek yerine bir makro ile kod tekrarlarının önüne geçebilir, veri yapılarını basitçe
144+ tanımlayabiliriz. crud isimli makro argüman olarak gelen identifier ve type bilgilerini kullanarak struct'ın temel
145+ halini inşa eder ve aynı zamanda new metodunu otomatik olarak implemente eder.
0 commit comments