In Rust gibt es keine Map-Literal-Syntax. Ich kenne den genauen Grund nicht, aber ich gehe davon aus, dass die Tatsache, dass es mehrere Datenstrukturen gibt, die maplike wirken (wie beide BTreeMap
und HashMap
), es schwierig machen würde, eine auszuwählen.
Sie können jedoch ein Makro erstellen, um die Aufgabe für Sie zu erledigen, wie unter Warum funktioniert dieses rostige HashMap-Makro nicht mehr? . Hier ist das Makro ein wenig vereinfacht und mit genügend Struktur, um es auf dem Spielplatz laufen zu lassen :
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));
}
Dies hat keine zusätzliche Zuordnung und ist maximal effizient.
In einer nächtlichen Version von Rust können Sie sowohl unnötige Zuweisungen als auch die Notwendigkeit eines Makros vermeiden :
#![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);
}
Diese Logik kann dann auch wieder in ein Makro eingeschlossen werden:
#![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);
}
Siehe auch:
grabbag_macros
Kiste. Sie können die Quelle hier sehen: github.com/DanielKeep/rust-grabbag/blob/master/grabbag_macros/… .