1个稳定版本
1.0.0 | 2020年5月26日 |
---|
#2729 在 Rust模式
7KB
一个提供两个额外排序方法的crate
假设你有一个元组的向量,你希望按其中一个元素进行排序(可能通过enumerate或zip迭代器方法获得,然后收集到Vec中)。现在,如果你写下以下内容,你会得到生命周期错误
let mut letters = vec![
(1, "C".to_string()),
(2, "B".to_string()),
(3, "B".to_string()),
(4, "A".to_string())
];
letters.sort_by_key(|x| &x.1);
println!("Letters: {:?}", letters);
所以你可能尝试不借用,但然后你意识到String不是Copy
let mut letters = vec![
(1, "C".to_string()),
(2, "B".to_string()),
(3, "B".to_string()),
(4, "A".to_string())
];
letters.sort_by_key(|x| x.1);
println!("Letters: {:?}", letters);
所以这失败了,因为你将要从数组中移动出去!你不想为比较这些字符串而不得不昂贵的克隆所有这些字符串。这正是这个库发挥作用的地方
use sort_by_borrowed_key::SortByBorrowedKey;
let mut letters = vec![
(1, "C".to_string()),
(2, "B".to_string()),
(3, "B".to_string()),
(4, "A".to_string())
];
letters.sort_by_borrowed_key(|x| &x.1);
let expected = vec![
(4, "A".to_string()),
(2, "B".to_string()),
(3, "B".to_string()),
(1, "C".to_string())
];
assert_eq!(letters, expected);
就是这样!该crate还增加了一个不稳定的排序版本的同一种方法,sort_unstable_by_borrowed_key
,它更快,但可能会改变相等元素的顺序(请参阅[T]::sort_unstable
的文档)。
非常感谢freenode IRC上danieldg
在##rust
上的帮助,包括一些出色的示例,让我理解如何编写这个库!