Makrók

Makrók

Nehéz

Utasítások

A makrók a Rust-programozó eszköztárának erős részét alkotják, és a példa alapú makrók viszonylag egyszerű módot kínálnak arra, hogy hozzáférj ehhez a lehetőséghez. Írjunk hát egyet!

Kontextus

Mi is az a makró? A Wikipédia így írja le:

A makró (a „macroinstruction” rövidítése, a görög μακρός »hosszú« szóból) a számítástechnikában olyan szabály vagy minta, amely meghatározza, hogy egy adott bemeneti sorozatot (gyakran karaktersorozatot) egy megadott eljárás szerint hogyan kell egy helyettesítő kimeneti sorozatra (szintén gyakran karaktersorozatra) leképezni. Azt a leképezési folyamatot, amely egy makróhasználatot egy adott sorozattá alakít át (példányosít), makrókiterjesztésnek nevezik.

Tanulságos! De hogy konkrétabbak legyünk: a makrók olyan különleges szintaxist jelentenek, amellyel kódot generálhatsz fordítási időben. A makrókat használhatod fordítási idejű számításokra, de gyakrabban csak egy újabb módot jelentenek arra, hogy absztraháld a kódodat. Például valószínűleg már találkoztál a println!() és a vec![] makróval. Mindkettő tetszőleges számú argumentumot fogad, ezért nem lehet őket egyszerű függvényként kifejezni. Ugyanakkor mindig bizonyos mennyiségű, teljesen szabványos Rust-kódra terjednek ki. Ha érdekel, a cargo expand alparanccsal megnézheted, milyen eredményt ad a makrókiterjesztés a kódodban.

A Rust makróiról bővebben a The Rust Book jó fejezetében olvashatsz.

A feladat

A vec![] makróval tetszőleges hosszúságú Vec-et hozhatsz létre közvetlenül a kódban. A Rustban viszont nincs beépített mód arra, hogy közvetlenül HashMap-et hozz létre. Ezt úgy orvosolhatod, hogy megírsz egy hashmap!() makrót.

Például a könyvtárad egy felhasználója ezt írhatja: hashmap!('a' => 3, 'b' => 11, 'z' => 32). Ennek a következő kódra kell kiterjednie:

{
   let mut hm = HashMap::new();
   hm.insert('a', 3);
   hm.insert('b', 11);
   hm.insert('z', 32);
   hm
}

Vedd figyelembe, hogy a maplit crate egy olyan makrót kínál, amely tökéletesen megoldja ezt a feladatot. Kérünk, hogy a saját megoldásodat írd meg ahelyett, hogy ezt a crate-et használnád; és mielőtt megnézed a forráskódját, előbb próbálkozz egyedül.


Forrás

Peter Goodspeed-Niklaus
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Rust Exercism

Készen állsz elkezdeni a(z) Makrók feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Rust nyelvet 99 feladat segítségével, valódi emberi mentorálással, mindez ingyen.