Rust में मैप शाब्दिक सिंटैक्स नहीं है। मुझे इसका सटीक कारण नहीं पता है , लेकिन मुझे उम्मीद है कि यह तथ्य है कि कई डेटा संरचनाएं हैं जो मैपलाइक (जैसे कि दोनों ) BTreeMap
और जैसे कार्य करते हैं, HashMap
एक को चुनना मुश्किल होगा।
हालाँकि, आप अपने लिए काम करने के लिए एक मैक्रो बना सकते हैं, जैसा कि यह दिखाया गया है कि यह जंग हाशप मैक्रो अब काम क्यों नहीं करती है? । यहाँ है कि मैक्रो ने थोड़ा सा सरलीकरण किया है और पर्याप्त संरचना के साथ खेल के मैदान में इसे चलाने योग्य बनाया जा सकता है :
macro_rules! map(
{ $($key:expr => $value:expr),+ } => {
{
let mut m = ::std::collections::HashMap::new();
$(
m.insert($key, $value);
)+
m
}
};
);
fn main() {
let names = map!{ 1 => "one", 2 => "two" };
println!("{} -> {:?}", 1, names.get(&1));
println!("{} -> {:?}", 10, names.get(&10));
}
यह मैक्रो एक अनावश्यक इंटरमीडिएट को आवंटित करने से बचता है Vec
, लेकिन इसका उपयोग नहीं करता है, क्योंकि इसमें HashMap::with_capacity
कुछ बेकार हो सकते हैं जैसे HashMap
कि मान जोड़े जाते हैं। मैक्रो का एक और अधिक जटिल संस्करण जो मानों को गिनता है, संभव है, लेकिन प्रदर्शन लाभ शायद कुछ नहीं हैं जो मैक्रो के अधिकांश उपयोग से लाभ होगा।
जंग के एक रात के संस्करण में, आप दोनों अनावश्यक आवंटन (और वसूली) से बच सकते हैं और साथ ही एक मैक्रो की आवश्यकता भी हो सकती है:
#![feature(array_value_iter)]
use std::array::IntoIter;
use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};
use std::iter::FromIterator;
fn main() {
let s = Vec::from_iter(IntoIter::new([1, 2, 3]));
println!("{:?}", s);
let s = BTreeSet::from_iter(IntoIter::new([1, 2, 3]));
println!("{:?}", s);
let s = HashSet::<_>::from_iter(IntoIter::new([1, 2, 3]));
println!("{:?}", s);
let s = BTreeMap::from_iter(IntoIter::new([(1, 2), (3, 4)]));
println!("{:?}", s);
let s = HashMap::<_, _>::from_iter(IntoIter::new([(1, 2), (3, 4)]));
println!("{:?}", s);
}
इस तर्क को एक मैक्रो में भी लपेटा जा सकता है:
#![feature(array_value_iter)]
use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet};
macro_rules! collection {
($($k:expr => $v:expr),* $(,)?) => {
std::iter::Iterator::collect(std::array::IntoIter::new([$(($k, $v),)*]))
};
($($v:expr),* $(,)?) => {
std::iter::Iterator::collect(std::array::IntoIter::new([$($v,)*]))
};
}
fn main() {
let s: Vec<_> = collection![1, 2, 3];
println!("{:?}", s);
let s: BTreeSet<_> = collection! { 1, 2, 3 };
println!("{:?}", s);
let s: HashSet<_> = collection! { 1, 2, 3 };
println!("{:?}", s);
let s: BTreeMap<_, _> = collection! { 1 => 2, 3 => 4 };
println!("{:?}", s);
let s: HashMap<_, _> = collection! { 1 => 2, 3 => 4 };
println!("{:?}", s);
}
यह सभी देखें:
grabbag_macros
टोकरा में भी एक है । आप यहाँ स्रोत देख सकते हैं: github.com/DanielKeep/rust-grabbag/blob/master/grabbag_macros/… ।