88本库为Rust标准库中的所有集合类型提供宏,以及基于引用的迭代器
99
1010---
11- 简单示例
1211
12+ 简单示例
1313``` rust
14+ use better_comprehension :: vector;
1415let vec_1 = vec! [" AB" . to_string (), " CD" . to_string ()];
15-
1616let vec : Vec <String > = vector! [x . clone () for x in vec_1 ];
1717assert_eq! (vec , vec! [" AB" . to_string (), " CD" . to_string ()]);
1818```
19-
2019---
20+
2121你也可以在推导式中使用模式
2222``` rust
23+ use better_comprehension :: vec_deque;
24+ use std :: collections :: VecDeque ;
2325struct Person {
2426 name : String ,
2527 age : i32 ,
2628}
2729let people = [Person { name : " Joe" . to_string (), age : 20 },
2830 Person { name : " Bob" . to_string (), age : 25 }];
29-
30- let vec_deque = vec_deque! [name . clone () for Person { name , .. } in people ];
31- assert_eq! (vec_deque , VecDeque :: from ([" Joe" . to_string (), " Bob" . to_string ()]));
31+ let vec_deque = vec_deque! [ name . clone ()
32+ for Person { name , .. } in people ];
33+ assert_eq! (vec_deque ,
34+ VecDeque :: from ([" Joe" . to_string (),
35+ " Bob" . to_string ()]));
3236```
3337---
3438
3539过滤集合中的值
3640``` rust
41+ use better_comprehension :: linked_list;
42+ use std :: collections :: LinkedList ;
3743let linked_list = linked_list! [ i * 2 for i in 1 ..= 3 if i != 2 ];
3844assert_eq! (linked_list , LinkedList :: from ([2 , 6 ]));
3945```
4046---
4147
4248根据条件返回不同的值
4349``` rust
50+ use better_comprehension :: b_tree_set;
51+ use std :: collections :: BTreeSet ;
4452let b_tree_set = b_tree_set! {
4553 i if i - 1 == 0 else i + 10
4654 for i in 1 ..= 3 if i != 2
@@ -49,8 +57,11 @@ assert_eq!(b_tree_set, BTreeSet::from([1, 13]));
4957```
5058
5159---
60+
5261嵌套推导式
5362``` rust
63+ use better_comprehension :: binary_heap;
64+ use std :: collections :: BinaryHeap ;
5465let binary_heap = binary_heap! [
5566 i if (i - 1 == 0 || j - 2 == 0 ) else i + 10
5667 for i in 1 ..= 3 if i != 2
@@ -61,6 +72,7 @@ assert_eq!(binary_heap.into_sorted_vec(), vec![1, 1, 3, 13]);
6172
6273和python的推导式一样, 本库的for循环是从上到下读取的.
6374``` rust
75+ use better_comprehension :: vector;
6476let vec = vector! [
6577 (top ,bottom )
6678 for top in 1 ..= 3 if top != 2
@@ -73,6 +85,7 @@ assert_eq!(vec, vec![(1, 4), (1, 5), (1, 6),
7385
7486所以通常来说, 对于多层循环, 如果你希望原容器被消耗, 你应该写成如下这样:
7587``` rust
88+ use better_comprehension :: vector;
7689let vec_1 = vec! [" ABC" . to_string (), " DEF" . to_string ()];
7790let vec_2 = vec! [" abc" . to_string (), " def" . to_string ()];
7891let vec_3 = vec! [123 , 456 ];
@@ -111,6 +124,7 @@ println!("{:?}", vec_2); // work well
111124你唯一需要做的就是在你想要保留所有权的变量后面` 加上.iter() ` 或` 使用 & ` ,
112125其余会在宏内自动处理.
113126``` rust
127+ use better_comprehension :: vector;
114128let vec_1 = vec! [" ABC" . to_string (), " DEF" . to_string ()];
115129let vec_2 = vec! [" abc" . to_string (), " def" . to_string ()];
116130let vec_3 = vec! [123 , 456 ];
@@ -130,6 +144,8 @@ println!("{:?}", vec_2); // work well
130144同时, 该库还支持键值对容器类型, HashMap, BTreeMap
131145
132146``` rust
147+ use better_comprehension :: hash_map;
148+ use std :: collections :: HashMap ;
133149let vec_key = vec! [" key_1" . to_string (),
134150 " key_2" . to_string (),
135151 " key_3" . to_string ()];
@@ -144,9 +160,9 @@ let hash_map = hash_map!{
144160assert_eq! (
145161 hash_map ,
146162 HashMap :: from ([
147- (" key_1" . to_string (), 3 ),
148- (" key_2" . to_string (), 3 ),
149- (" key_3" . to_string (), 3 )
163+ (" key_1" . to_string (), 3 ),
164+ (" key_2" . to_string (), 3 ),
165+ (" key_3" . to_string (), 3 )
150166 ])
151167);
152168```
@@ -163,6 +179,7 @@ assert_eq!(
163179* 范围表达式(如: 1..=3)
164180
165181``` rust
182+ use better_comprehension :: iterator_ref;
166183let vec_1 = [" 123" . to_string (),
167184 " 456" . to_string (),
168185 " 789" . to_string ()];
@@ -171,10 +188,10 @@ let vec_2 = ["ABC".to_string(),
171188 " GHI" . to_string ()];
172189
173190let mut result3 = iterator_ref! [
174- (x . clone (), y . clone ()) if x . contains (" 1" ) else (y . clone (), x . clone ())
175- for x in vec_1 if x . contains (" 1" ) || x . contains (" 7" )
176- for i in 1 ..= 2
177- for y in vec_2 if y . contains (" D" ) || x . contains (" 3" )];
191+ (x . clone (), y . clone ()) if x . contains (" 1" ) else (y . clone (), x . clone ())
192+ for x in vec_1 if x . contains (" 1" ) || x . contains (" 7" )
193+ for i in 1 ..= 2
194+ for y in vec_2 if y . contains (" D" ) || x . contains (" 3" )];
178195
179196// still alive
180197println! (" {:?}" , vec_1 );
@@ -255,6 +272,8 @@ b_tree_set! : insert() 添加元素
255272# 一些实际的例子
256273
257274``` rust
275+ use better_comprehension :: vector;
276+ use std :: collections :: {HashMap , BTreeMap };
258277// 创建3x3矩阵
259278let matrix = vector! [
260279 vector! [i * 3 + j + 1 for j in 0 .. 3 ]
@@ -268,15 +287,21 @@ vector![row[i]
268287for i in 0 .. 3
269288];
270289// matrix is alive
271- assert_eq! (matrix , vec! [vec! [1 , 2 , 3 ], vec! [4 , 5 , 6 ], vec! [7 , 8 , 9 ]]);
290+ assert_eq! (matrix , vec! [vec! [1 , 2 , 3 ],
291+ vec! [4 , 5 , 6 ],
292+ vec! [7 , 8 , 9 ]]);
272293assert_eq! (
273294 transposed ,
274- vec! [vec! [1 , 4 , 7 ], vec! [2 , 5 , 8 ], vec! [3 , 6 , 9 ]]
295+ vec! [vec! [1 , 4 , 7 ],
296+ vec! [2 , 5 , 8 ],
297+ vec! [3 , 6 , 9 ]]
275298);
276299```
277300
278301
279302``` rust
303+ use better_comprehension :: {hash_map, b_tree_map, vector};
304+ use std :: collections :: {HashMap , BTreeMap };
280305#[derive(Debug , PartialEq , Eq )]
281306struct Score {
282307 subject : & 'static str ,
@@ -342,8 +367,8 @@ let math_scores: HashMap<&String, u8> = hash_map![
342367
343368assert_eq! (
344369 math_scores ,
345- HashMap :: from ([(& " Alice" . to_string (), 95 ), ( & " Bob " . to_string (), 78 )])
346- );
370+ HashMap :: from ([(& " Alice" . to_string (), 95 ),
371+ ( & " Bob " . to_string (), 78 )]) );
347372
348373// use for loop
349374let high_scores = {
0 commit comments