8
8
本库为Rust标准库中的所有集合类型提供宏,以及基于引用的迭代器
9
9
10
10
---
11
- 简单示例
12
11
12
+ 简单示例
13
13
``` rust
14
+ use better_comprehension :: vector;
14
15
let vec_1 = vec! [" AB" . to_string (), " CD" . to_string ()];
15
-
16
16
let vec : Vec <String > = vector! [x . clone () for x in vec_1 ];
17
17
assert_eq! (vec , vec! [" AB" . to_string (), " CD" . to_string ()]);
18
18
```
19
-
20
19
---
20
+
21
21
你也可以在推导式中使用模式
22
22
``` rust
23
+ use better_comprehension :: vec_deque;
24
+ use std :: collections :: VecDeque ;
23
25
struct Person {
24
26
name : String ,
25
27
age : i32 ,
26
28
}
27
29
let people = [Person { name : " Joe" . to_string (), age : 20 },
28
30
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 ()]));
32
36
```
33
37
---
34
38
35
39
过滤集合中的值
36
40
``` rust
41
+ use better_comprehension :: linked_list;
42
+ use std :: collections :: LinkedList ;
37
43
let linked_list = linked_list! [ i * 2 for i in 1 ..= 3 if i != 2 ];
38
44
assert_eq! (linked_list , LinkedList :: from ([2 , 6 ]));
39
45
```
40
46
---
41
47
42
48
根据条件返回不同的值
43
49
``` rust
50
+ use better_comprehension :: b_tree_set;
51
+ use std :: collections :: BTreeSet ;
44
52
let b_tree_set = b_tree_set! {
45
53
i if i - 1 == 0 else i + 10
46
54
for i in 1 ..= 3 if i != 2
@@ -49,8 +57,11 @@ assert_eq!(b_tree_set, BTreeSet::from([1, 13]));
49
57
```
50
58
51
59
---
60
+
52
61
嵌套推导式
53
62
``` rust
63
+ use better_comprehension :: binary_heap;
64
+ use std :: collections :: BinaryHeap ;
54
65
let binary_heap = binary_heap! [
55
66
i if (i - 1 == 0 || j - 2 == 0 ) else i + 10
56
67
for i in 1 ..= 3 if i != 2
@@ -61,6 +72,7 @@ assert_eq!(binary_heap.into_sorted_vec(), vec![1, 1, 3, 13]);
61
72
62
73
和python的推导式一样, 本库的for循环是从上到下读取的.
63
74
``` rust
75
+ use better_comprehension :: vector;
64
76
let vec = vector! [
65
77
(top ,bottom )
66
78
for top in 1 ..= 3 if top != 2
@@ -73,6 +85,7 @@ assert_eq!(vec, vec![(1, 4), (1, 5), (1, 6),
73
85
74
86
所以通常来说, 对于多层循环, 如果你希望原容器被消耗, 你应该写成如下这样:
75
87
``` rust
88
+ use better_comprehension :: vector;
76
89
let vec_1 = vec! [" ABC" . to_string (), " DEF" . to_string ()];
77
90
let vec_2 = vec! [" abc" . to_string (), " def" . to_string ()];
78
91
let vec_3 = vec! [123 , 456 ];
@@ -111,6 +124,7 @@ println!("{:?}", vec_2); // work well
111
124
你唯一需要做的就是在你想要保留所有权的变量后面` 加上.iter() ` 或` 使用 & ` ,
112
125
其余会在宏内自动处理.
113
126
``` rust
127
+ use better_comprehension :: vector;
114
128
let vec_1 = vec! [" ABC" . to_string (), " DEF" . to_string ()];
115
129
let vec_2 = vec! [" abc" . to_string (), " def" . to_string ()];
116
130
let vec_3 = vec! [123 , 456 ];
@@ -130,6 +144,8 @@ println!("{:?}", vec_2); // work well
130
144
同时, 该库还支持键值对容器类型, HashMap, BTreeMap
131
145
132
146
``` rust
147
+ use better_comprehension :: hash_map;
148
+ use std :: collections :: HashMap ;
133
149
let vec_key = vec! [" key_1" . to_string (),
134
150
" key_2" . to_string (),
135
151
" key_3" . to_string ()];
@@ -144,9 +160,9 @@ let hash_map = hash_map!{
144
160
assert_eq! (
145
161
hash_map ,
146
162
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 )
150
166
])
151
167
);
152
168
```
@@ -163,6 +179,7 @@ assert_eq!(
163
179
* 范围表达式(如: 1..=3)
164
180
165
181
``` rust
182
+ use better_comprehension :: iterator_ref;
166
183
let vec_1 = [" 123" . to_string (),
167
184
" 456" . to_string (),
168
185
" 789" . to_string ()];
@@ -171,10 +188,10 @@ let vec_2 = ["ABC".to_string(),
171
188
" GHI" . to_string ()];
172
189
173
190
let 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" )];
178
195
179
196
// still alive
180
197
println! (" {:?}" , vec_1 );
@@ -255,6 +272,8 @@ b_tree_set! : insert() 添加元素
255
272
# 一些实际的例子
256
273
257
274
``` rust
275
+ use better_comprehension :: vector;
276
+ use std :: collections :: {HashMap , BTreeMap };
258
277
// 创建3x3矩阵
259
278
let matrix = vector! [
260
279
vector! [i * 3 + j + 1 for j in 0 .. 3 ]
@@ -268,15 +287,21 @@ vector![row[i]
268
287
for i in 0 .. 3
269
288
];
270
289
// 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 ]]);
272
293
assert_eq! (
273
294
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 ]]
275
298
);
276
299
```
277
300
278
301
279
302
``` rust
303
+ use better_comprehension :: {hash_map, b_tree_map, vector};
304
+ use std :: collections :: {HashMap , BTreeMap };
280
305
#[derive(Debug , PartialEq , Eq )]
281
306
struct Score {
282
307
subject : & 'static str ,
@@ -342,8 +367,8 @@ let math_scores: HashMap<&String, u8> = hash_map![
342
367
343
368
assert_eq! (
344
369
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 )]) );
347
372
348
373
// use for loop
349
374
let high_scores = {
0 commit comments