#collection #collect #macro

collect-mac

这个crate提供了一个collect!宏,可以用来轻松构建任意集合,包括VecStringHashMap。它还努力在可能的情况下,通过单次分配来构建集合。

1个不稳定版本

使用旧的Rust 2015

0.1.0 2015年11月13日

1832数据结构

Download history 211/week @ 2024-03-13 250/week @ 2024-03-20 229/week @ 2024-03-27 175/week @ 2024-04-03 158/week @ 2024-04-10 192/week @ 2024-04-17 230/week @ 2024-04-24 207/week @ 2024-05-01 187/week @ 2024-05-08 178/week @ 2024-05-15 220/week @ 2024-05-22 181/week @ 2024-05-29 143/week @ 2024-06-05 132/week @ 2024-06-12 160/week @ 2024-06-19 117/week @ 2024-06-26

575 每月下载量
用于 18 个crate(10个直接使用)

MIT 许可证

8KB
83

collect!

这个crate提供了一个collect!宏,可以用来轻松构建任意集合,包括VecStringHashMap。它还努力在可能的情况下,通过单次分配来构建集合。

(主分支的文档.)


lib.rs:

这个crate提供了一个collect!宏,可以用来轻松构建任意集合,包括VecStringHashMap。它还努力在可能的情况下,通过单次分配来构建集合。

示例

// 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];

详细信息

该宏支持任何实现了DefaultExtend特性的集合。具体来说,它使用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);
}
}
}

无运行时依赖