Макрос за HashMap, както има за Vec?
Знаем, че има удобен начин да създаваме вектори, със vec![1, 2, 3]
макроса. За нещастие, за HashMap няма такова нещо. Може да направим това:
let dictionary = {
let d = HashMap::new();
d.insert("Gekommen", "Дойдох");
d.insert("Gesehen", "Видях");
d.insert("Gerusten", "Писах Rust");
d
}
Но няма готин макрос или магически синтаксис за това. С малко търсене из Stack Overflow, обаче...
macro_rules! map(
{ $($key:expr => $value:expr),+ } => {
{
let mut m = ::std::collections::HashMap::new();
$(
m.insert($key, $value);
)+
m
}
};
);
Това ни позволява да напишем горния пример ей така:
let dictionary = map!{ "Gekommen" => "Дойдох", "Gesehen" => "Видях", "Gerusten" => "Писах Rust" };
И за да не копираме тоя макрос наляво-надясно, в собствените си проекти може просто да използваме пакета maplit. Цъкнете на "Documentation", ако искате да прочетете как се използва, цъкнете на "Repository", ако сте любопитни как е имплементиран.