13 个版本 (破坏性)
使用旧的 Rust 2015
0.12.0 |
|
---|---|
0.11.0 | 2016 年 10 月 13 日 |
0.10.0 | 2016 年 1 月 19 日 |
0.8.0 | 2015 年 12 月 29 日 |
0.0.1 | 2015 年 3 月 18 日 |
#1464 在 数据结构
每月 35 次下载
49KB
976 行
折衷
Rust 的实验性集合特性。
文档可在 https://apasel422.github.io/eclectic/eclectic 找到。
要使用 eclectic
与 Cargo 一起,请将以下内容添加到 Cargo.toml
[dependencies]
eclectic = "0.11"
并添加到 crate 根目录
extern crate eclectic;
lib.rs
:
通用编程的集合特性。
此库中的主要特性包括
当结合这些特性时,两个标记特性将启用额外操作的使用
Marker | Operations | 类似类型 |
---|---|---|
(无) | 对集合及其元素的只读访问 | &[T] |
修改 |
对集合元素的写访问 | &mut [T] |
添加/删除 |
插入和删除集合的元素 | &mut Vec<T> |
通用代码应仅指定其操作所需的界限,但可能为未来的兼容性指定额外的界限。通用代码还应在可能的情况下使用具有 ?Sized
界限的集合特性,以支持切片和特性对象。
示例
插入排序
use eclectic::{List, Mutate};
fn insertion_sort<L: ?Sized + List + Mutate>(list: &mut L) where L::Item: Ord {
for i in 1..list.len() { // `len` is defined on `Collection`, a supertrait of `List`
let mut j = i;
while j > 0 && list.get(j) < list.get(j - 1) {
list.swap(j, j - 1); // the `Mutate` bound on `L` enables the use of `List::swap`
j -= 1;
}
}
}
use std::collections::VecDeque;
let mut vec = vec!['c', 'a', 'e', 'd', 'b'];
let mut vec_deque: VecDeque<_> = vec.iter().cloned().collect();
insertion_sort(&mut vec);
assert_eq!(vec, ['a', 'b', 'c', 'd', 'e']);
insertion_sort(&mut vec_deque);
assert!(vec_deque.iter().eq(&['a', 'b', 'c', 'd', 'e']));
关于特性对象的说明
该包中的一些特性方法返回 Box<Iterator>
,这需要不必要的堆分配和不可见性(例如,擦除如 Clone
和 DoubleEndedIterator
的特性)。这是为了弥补(希望是临时的)无法定义更高阶关联类型,如
trait Collection {
type Drain<'a>: 'a + Iterator<Item = Self::Item>;
fn drain<'a>(&'a mut self) -> Self::Drain<'a> where Self: AddRemove;
}
如果 Rust 获得了这些类型,则迭代器和条目返回方法将更改为使用它们。映射。集合。