13 个版本 (破坏性)

使用旧的 Rust 2015

0.12.0 2017 年 2 月 5 日
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 次下载

MIT/Apache

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>,这需要不必要的堆分配和不可见性(例如,擦除如 CloneDoubleEndedIterator 的特性)。这是为了弥补(希望是临时的)无法定义更高阶关联类型,如

trait Collection {
    type Drain<'a>: 'a + Iterator<Item = Self::Item>;

    fn drain<'a>(&'a mut self) -> Self::Drain<'a> where Self: AddRemove;
}

如果 Rust 获得了这些类型,则迭代器和条目返回方法将更改为使用它们。映射。集合。

无运行时依赖项

特性