1- #![ allow(
2- unused,
3- clippy:: filter_map_bool_then,
4- clippy:: nonminimal_bool,
5- clippy:: unnecessary_lazy_evaluations,
6- clippy:: if_same_then_else,
7- clippy:: useless_conversion
8- ) ]
91use better_comprehension:: {
102 b_tree_map, b_tree_set, binary_heap, hash_map, hash_set, iterator_ref, linked_list, vec_deque,
113 vector,
@@ -21,11 +13,22 @@ fn main() {
2113 test_vec_deque ( ) ;
2214 test_hash_set ( ) ;
2315 test_hash_map ( ) ;
24- test_自建类型 ( ) ;
16+ test_custom_type ( ) ;
2517 test_ref_iterator ( ) ;
18+ test_pattern_matching ( ) ;
19+ test_nested_comprehension ( ) ;
20+ test_ownership_handling ( ) ;
2621}
2722
2823fn test_vec ( ) {
24+ // 简单示例
25+ {
26+ let vec_1 = vec ! [ "AB" . to_string( ) , "CD" . to_string( ) ] ;
27+ let vec: Vec < String > = vector ! [ x. clone( ) for x in vec_1] ;
28+ assert_eq ! ( vec, vec![ "AB" . to_string( ) , "CD" . to_string( ) ] ) ;
29+ }
30+
31+ // 条件返回不同值
2932 {
3033 let result = vector ! [
3134 [ x, y] if x > y else [ y, x]
@@ -45,79 +48,198 @@ fn test_vec() {
4548 [ 6 , 6 ]
4649 ]
4750 ) ;
48- println ! ( "测试返回元组_2迭代器_有条件" ) ;
4951 }
52+
53+ // 多层循环和引用
5054 {
5155 let vec_comprehension1 = vec ! [ ( "a" , 1 ) , ( "b" , 2 ) , ( "c" , 3 ) ] ;
5256 let vec_comprehension2 = vec ! [ ( "a" , 1 ) , ( "b" , 2 ) , ( "c" , 3 ) ] ;
5357 let vec_comprehension3 = vec ! [ ( "a" , 1 ) , ( "b" , 2 ) , ( "c" , 3 ) ] ;
5458 let _result = vector ! [
55- y if x > * z else y
59+ y if x > z else y
5660 for z in & vec_comprehension3
57- for x in vec_comprehension1. clone ( )
58- for y in vec_comprehension2
61+ for x in vec_comprehension1
62+ for y in & vec_comprehension2
5963 ] ;
60-
61- println ! ( "{:#?}" , vec_comprehension1) ;
62- // println!("{:#?}", vec_comprehension2);
63- println ! ( "{:#?}" , vec_comprehension3) ;
64- println ! ( "{:#?}" , _result) ;
6564 }
6665}
6766
6867fn test_binary_heap ( ) {
68+ // 简单示例
6969 let vec = vec ! [ 1 , 2 , 3 ] ;
70- let result = binary_heap ! [ x for x in vec] ;
70+ let result = binary_heap ! [ * x for x in vec] ;
7171 assert_eq ! ( result. into_sorted_vec( ) , vec![ 1 , 2 , 3 ] ) ;
72+
73+ // 条件返回不同值
74+ let binary_heap = binary_heap ! [
75+ i if i-1 == 0 || j-2 == 0 else i+10
76+ for i in 1 ..=3 if i != 2
77+ for j in 1 ..=3 if j+i != 4 ] ;
78+ assert_eq ! ( binary_heap. into_sorted_vec( ) , vec![ 1 , 1 , 3 , 13 ] ) ;
7279}
7380
7481fn test_linked_list ( ) {
82+ // 简单示例
7583 let vec = vec ! [ 1 , 2 , 3 ] ;
76- let result = linked_list ! [ x for x in vec] ;
84+ let result = linked_list ! [ * x for x in vec] ;
7785 assert_eq ! ( result, LinkedList :: from( [ 1 , 2 , 3 ] ) ) ;
86+
87+ // 过滤值
88+ let linked_list = linked_list ! [ i* 2 for i in 1 ..=3 if i != 2 ] ;
89+ assert_eq ! ( linked_list, LinkedList :: from( [ 2 , 6 ] ) ) ;
7890}
7991
8092fn test_b_tree_set ( ) {
93+ // 简单示例
8194 let vec = vec ! [ 1 , 2 , 3 ] ;
82- let result = b_tree_set ! [ x for x in vec] ;
95+ let result = b_tree_set ! [ * x for x in vec] ;
8396 assert_eq ! ( result, BTreeSet :: from( [ 1 , 2 , 3 ] ) ) ;
97+
98+ // 条件返回不同值
99+ let b_tree_set = b_tree_set ! {
100+ i if i-1 == 0 else i+10
101+ for i in 1 ..=3 if i != 2
102+ } ;
103+ assert_eq ! ( b_tree_set, BTreeSet :: from( [ 1 , 13 ] ) ) ;
84104}
85105
86106fn test_b_tree_map ( ) {
107+ // 简单示例
87108 let vec_key = vec ! [ "key_1" , "key_2" , "key_3" ] ;
88109 let vec_value = [ 1 , 2 , 3 ] ;
89110
90- let result = b_tree_map ! [ x , y for y in vec_value for x in vec_key] ;
111+ let result = b_tree_map ! [ * x , * y for y in vec_value for x in vec_key] ;
91112 assert_eq ! (
92113 result,
93114 BTreeMap :: from( [ ( "key_1" , 3 ) , ( "key_2" , 3 ) , ( "key_3" , 3 ) ] )
94115 ) ;
116+
117+ // 键值对分隔符测试
118+ let vec_key = [
119+ "key_1" . to_string ( ) ,
120+ "key_2" . to_string ( ) ,
121+ "key_3" . to_string ( ) ,
122+ ] ;
123+ let vec_value = [ 1 , 2 , 3 ] ;
124+
125+ // 使用冒号分隔
126+ let b_tree_map1 = b_tree_map ! {
127+ key. clone( ) : * value
128+ for key in vec_key. iter( )
129+ for value in vec_value
130+ } ;
131+
132+ // 使用箭头分隔
133+ let vec_key = [
134+ "key_1" . to_string ( ) ,
135+ "key_2" . to_string ( ) ,
136+ "key_3" . to_string ( ) ,
137+ ] ;
138+ let b_tree_map2 = b_tree_map ! {
139+ key. clone( ) => * value
140+ for key in vec_key. iter( )
141+ for value in vec_value
142+ } ;
143+
144+ // 使用逗号分隔
145+ let vec_key = [
146+ "key_1" . to_string ( ) ,
147+ "key_2" . to_string ( ) ,
148+ "key_3" . to_string ( ) ,
149+ ] ;
150+ let b_tree_map3 = b_tree_map ! {
151+ key. clone( ) , * value
152+ for key in vec_key. iter( )
153+ for value in vec_value
154+ } ;
155+
156+ let expected = BTreeMap :: from ( [
157+ ( "key_1" . to_string ( ) , 3 ) ,
158+ ( "key_2" . to_string ( ) , 3 ) ,
159+ ( "key_3" . to_string ( ) , 3 ) ,
160+ ] ) ;
161+
162+ assert_eq ! ( b_tree_map1, expected) ;
163+ assert_eq ! ( b_tree_map2, expected) ;
164+ assert_eq ! ( b_tree_map3, expected) ;
95165}
96166
97167fn test_vec_deque ( ) {
168+ // 简单示例
98169 let vec = vec ! [ 1 , 2 , 3 ] ;
99- let result = vec_deque ! [ x for x in vec] ;
170+ let result = vec_deque ! [ * x for x in vec] ;
100171 assert_eq ! ( result, VecDeque :: from( [ 1 , 2 , 3 ] ) ) ;
172+
173+ // 模式匹配示例
174+ #[ derive( Debug , PartialEq , Eq ) ]
175+ struct Person {
176+ name : String ,
177+ age : i32 ,
178+ }
179+ let people = [
180+ Person {
181+ name : "Joe" . to_string ( ) ,
182+ age : 20 ,
183+ } ,
184+ Person {
185+ name : "Bob" . to_string ( ) ,
186+ age : 25 ,
187+ } ,
188+ ] ;
189+ let vec_deque = vec_deque ! [ name. clone( ) for Person { name, .. } in people] ;
190+ assert_eq ! (
191+ vec_deque,
192+ VecDeque :: from( [ "Joe" . to_string( ) , "Bob" . to_string( ) ] )
193+ ) ;
101194}
102195
103196fn test_hash_set ( ) {
197+ // 简单示例
104198 let vec = vec ! [ 1 , 2 , 3 ] ;
105- let result = hash_set ! [ x for x in vec] ;
199+ let result = hash_set ! [ * x for x in vec] ;
106200 assert_eq ! ( result, HashSet :: from( [ 1 , 2 , 3 ] ) ) ;
201+
202+ // 过滤值
203+ let hash_set = hash_set ! [ i* 2 for i in 1 ..=3 if i != 2 ] ;
204+ assert_eq ! ( hash_set, HashSet :: from( [ 2 , 6 ] ) ) ;
107205}
108206
109207fn test_hash_map ( ) {
208+ // 简单示例
110209 let vec_key = vec ! [ "key_1" , "key_2" , "key_3" ] ;
111210 let vec_value = [ 1 , 2 , 3 ] ;
112211
113- let result = hash_map ! [ x , y for y in vec_value for x in vec_key] ;
212+ let result = hash_map ! [ * x , * y for y in vec_value for x in vec_key] ;
114213 assert_eq ! (
115214 result,
116215 HashMap :: from( [ ( "key_1" , 3 ) , ( "key_2" , 3 ) , ( "key_3" , 3 ) ] )
117216 ) ;
217+
218+ // 键值对分隔符测试
219+ let vec_key = vec ! [
220+ "key_1" . to_string( ) ,
221+ "key_2" . to_string( ) ,
222+ "key_3" . to_string( ) ,
223+ ] ;
224+ let vec_value = [ 1 , 2 , 3 ] ;
225+
226+ let hash_map = hash_map ! {
227+ key. clone( ) : * value
228+ for key in vec_key
229+ for value in vec_value
230+ } ;
231+
232+ assert_eq ! (
233+ hash_map,
234+ HashMap :: from( [
235+ ( "key_1" . to_string( ) , 3 ) ,
236+ ( "key_2" . to_string( ) , 3 ) ,
237+ ( "key_3" . to_string( ) , 3 )
238+ ] )
239+ ) ;
118240}
119241
120- fn test_自建类型 ( ) {
242+ fn test_custom_type ( ) {
121243 #[ derive( Debug , PartialEq , Eq ) ]
122244 struct MyType {
123245 x : i32 ,
@@ -127,31 +249,104 @@ fn test_自建类型() {
127249 let vec_y = vec ! [ 2 , 4 , 6 ] ;
128250 let vec_x = vec ! [ 1 , 3 , 5 ] ;
129251 let _result = vector ! [
130- MyType { x, y }
252+ MyType { x: * x , y : * y }
131253 for y in vec_y
132- for x in vec_x if y == x + 1
254+ for x in vec_x if * y == * x + 1
255+ ] ;
256+ }
257+
258+ fn test_pattern_matching ( ) {
259+ #[ derive( Debug , PartialEq , Eq ) ]
260+ struct Person {
261+ name : String ,
262+ age : i32 ,
263+ }
264+
265+ let people = [
266+ Person {
267+ name : "Joe" . to_string ( ) ,
268+ age : 20 ,
269+ } ,
270+ Person {
271+ name : "Bob" . to_string ( ) ,
272+ age : 25 ,
273+ } ,
274+ Person {
275+ name : "Alice" . to_string ( ) ,
276+ age : 30 ,
277+ } ,
278+ ] ;
279+
280+ // 使用模式匹配提取字段
281+ let names = vector ! [ name. clone( ) for Person { name, .. } in & people] ;
282+ assert_eq ! (
283+ names,
284+ vec![ "Joe" . to_string( ) , "Bob" . to_string( ) , "Alice" . to_string( ) ]
285+ ) ;
286+
287+ // 使用模式匹配和条件过滤
288+ let adult_names = vector ! [
289+ name. clone( )
290+ for Person { name, age } in people
291+ if * age >= 25
292+ ] ;
293+ assert_eq ! ( adult_names, vec![ "Bob" . to_string( ) , "Alice" . to_string( ) ] ) ;
294+ }
295+
296+ fn test_nested_comprehension ( ) {
297+ // 嵌套推导式示例
298+ let vec = vector ! [
299+ ( top, bottom)
300+ for top in 1 ..=3 if top != 2
301+ for bottom in 4 ..=6 if bottom+top != 4
302+ ] ;
303+ assert_eq ! ( vec, vec![ ( 1 , 4 ) , ( 1 , 5 ) , ( 1 , 6 ) , ( 3 , 4 ) , ( 3 , 5 ) , ( 3 , 6 ) ] ) ;
304+
305+ // 多层条件嵌套
306+ let vec = vector ! [
307+ ( i, j, k)
308+ for i in 1 ..=2
309+ for j in 3 ..=4 if i+j > 4
310+ for k in 5 ..=6 if i+j+k > 10
311+ ] ;
312+ assert_eq ! ( vec, vec![ ( 1 , 4 , 6 ) , ( 2 , 3 , 6 ) , ( 2 , 4 , 5 ) , ( 2 , 4 , 6 ) ] ) ;
313+ }
314+
315+ fn test_ownership_handling ( ) {
316+ // 测试所有权处理
317+ let vec_1 = vec ! [ "ABC" . to_string( ) , "DEF" . to_string( ) ] ;
318+ let vec_2 = [ "abc" . to_string ( ) , "def" . to_string ( ) ] ;
319+ let vec_3 = vec ! [ 123 , 456 ] ;
320+
321+ let vec = vector ! [
322+ ( i. clone( ) , j. clone( ) , * k)
323+ for i in vec_1 if i == "ABC"
324+ for j in vec_2. iter( ) if j == "abc"
325+ for k in vec_3 if k == & 123
133326 ] ;
134- println ! ( "{:#?}" , _result) ;
327+
328+ assert_eq ! ( vec, vec![ ( "ABC" . to_string( ) , "abc" . to_string( ) , 123 ) ] ) ;
135329}
136330
137331fn test_ref_iterator ( ) {
138332 let vec_1 = [ "123" . to_string ( ) , "456" . to_string ( ) , "789" . to_string ( ) ] ;
139333 let vec_2 = [ "ABC" . to_string ( ) , "DEF" . to_string ( ) , "GHI" . to_string ( ) ] ;
140334
141- // let result = iterator_ref![x for x in vec_1 if x.contains("1") for i in 1..=9]; // 范围最外层
142-
143- // let result2 = iterator_ref![x for i in 1..=9 for x in vec_1 if x.contains("123")]; // 范围最内层
335+ // 基于引用的迭代器推导式
336+ let mut result3 = iterator_ref ! [
337+ ( x. clone( ) , y. clone( ) ) if x. contains( "1" ) else ( y. clone( ) , x. clone( ) )
338+ for x in vec_1 if x. contains( "1" ) || x. contains( "7" )
339+ for _ in 1 ..=2
340+ for y in vec_2 if y. contains( "D" ) || x. contains( "3" )
341+ ] ;
144342
145- let result3 = iterator_ref ! [
146- ( x , y )
147- for x in vec_1 if x . contains ( "1" ) || x . contains ( "7" )
148- for i in 1 ..= 9
149- for y in vec_2 if y . contains ( "A" ) || y . contains ( "D" ) || x . contains ( "3" ) ] ;
343+ // 验证迭代器已耗尽
344+ for _ in 0 ..= 9 {
345+ result3 . next ( ) ;
346+ }
347+ assert_eq ! ( result3 . next ( ) , None ) ;
150348
151- // println!("{:#?}", result2);
152- // for (x, y) in result3 {
153- // println!("{:#?}", x);
154- // println!("{:#?}", y);
155- // println!("--------------------------------");
156- // }
349+ // 验证原始集合未被消耗
350+ assert_eq ! ( vec_1. len( ) , 3 ) ;
351+ assert_eq ! ( vec_2. len( ) , 3 ) ;
157352}
0 commit comments