1个不稳定版本
使用旧的Rust 2015
0.1.0 | 2015年11月13日 |
---|
1832 在 数据结构 中
575 每月下载量
用于 18 个crate(10个直接使用)
8KB
83 行
collect!
这个crate提供了一个collect!
宏,可以用来轻松构建任意集合,包括Vec
、String
和HashMap
。它还努力在可能的情况下,通过单次分配来构建集合。
(主分支的文档.)
lib.rs
:
这个crate提供了一个collect!
宏,可以用来轻松构建任意集合,包括Vec
、String
和HashMap
。它还努力在可能的情况下,通过单次分配来构建集合。
示例
// In the crate root module:
#[macro_use] extern crate collect_mac;
// Initialise an empty collection.
let a: Vec<i32> = collect![];
let b: HashMap<String, bool> = collect![];
// Initialise a sequence.
let c: String = collect!['a', 'b', 'c'];
// Initialise a sequence with a type constraint.
let d = collect![as HashSet<_>: 0, 1, 2];
// Initialise a map collection.
let e: BTreeMap<i32, &str> = collect![
1 => "one",
2 => "two",
3 => "many",
4 => "lots",
];
// Initialise a map with a type constraint.
let f: HashMap<_, u8> = collect![as HashMap<i32, _>: 42 => 0, -11 => 2];
详细信息
该宏支持任何实现了Default
和Extend
特性的集合。具体来说,它使用Default
创建一个新空集合,然后对每个元素调用一次Extend
。
以下标准容器已测试并保证可以单次分配构建:
一般来说,单次分配构建是通过在第一次调用Extend
时提供元素数量来实现的。期望是,在插入第一个元素时,集合将尽可能预分配足够的空间来存储所有元素。
以下是一个Vec
的简化版Extend
实现示例:
impl<T> Extend<T> for Vec<T> {
#[inline]
fn extend<I: IntoIterator<Item=T>>(&mut self, iterable: I) {
let mut iterator = iterable.into_iter();
while let Some(element) = iterator.next() {
let len = self.len();
if len == self.capacity() {
let (lower, _) = iterator.size_hint();
self.reserve(lower.saturating_add(1));
}
self.push(element);
}
}
}