Skip to content

Commit 2d94bc9

Browse files
1.3: 更新文档, 增加更真实的样例
1 parent 86975ee commit 2d94bc9

File tree

4 files changed

+431
-18
lines changed

4 files changed

+431
-18
lines changed

README-CN.md

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,3 +251,127 @@ hash_map! : insert() 添加键值对
251251
b_tree_map! : insert() 添加键值对
252252

253253
b_tree_set! : insert() 添加元素
254+
255+
# 一些实际的例子
256+
257+
```rust
258+
// 创建3x3矩阵
259+
let matrix = vector![
260+
vector![i * 3 + j + 1 for j in 0..3]
261+
for i in 0..3
262+
];
263+
264+
// 矩阵转置
265+
let transposed = vector![
266+
vector![row[i]
267+
for row in matrix.iter()]
268+
for i in 0..3
269+
];
270+
// matrix is alive
271+
assert_eq!(matrix, vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]);
272+
assert_eq!(
273+
transposed,
274+
vec![vec![1, 4, 7], vec![2, 5, 8], vec![3, 6, 9]]
275+
);
276+
```
277+
278+
279+
```rust
280+
#[derive(Debug, PartialEq, Eq)]
281+
struct Score {
282+
subject: &'static str,
283+
score: u8,
284+
}
285+
#[derive(Debug, PartialEq, Eq)]
286+
struct Student {
287+
name: String,
288+
age: u8,
289+
scores: Vec<Score>,
290+
}
291+
292+
let students_data = [
293+
Student {
294+
name: "Alice".to_string(),
295+
age: 20,
296+
scores: vec![
297+
Score {
298+
subject: "Math",
299+
score: 95,
300+
},
301+
Score {
302+
subject: "English",
303+
score: 88,
304+
},
305+
],
306+
},
307+
Student {
308+
name: "Bob".to_string(),
309+
age: 21,
310+
scores: vec![
311+
Score {
312+
subject: "Math",
313+
score: 78,
314+
},
315+
Score {
316+
subject: "English",
317+
score: 85,
318+
},
319+
],
320+
},
321+
];
322+
323+
// use for loop
324+
let math_scores: HashMap<&String, u8> = {
325+
let mut math_scores = HashMap::new();
326+
for student in &students_data {
327+
for score in &student.scores {
328+
if score.subject == "Math" {
329+
math_scores.insert(&student.name, score.score);
330+
}
331+
}
332+
}
333+
math_scores
334+
};
335+
// ↓ 等价于 ↓
336+
// use comprehension!
337+
let math_scores: HashMap<&String, u8> = hash_map![
338+
&student.name => score.score
339+
for student in &students_data
340+
for score in &student.scores if score.subject == "Math"
341+
];
342+
343+
assert_eq!(
344+
math_scores,
345+
HashMap::from([(&"Alice".to_string(), 95), (&"Bob".to_string(), 78)])
346+
);
347+
348+
// use for loop
349+
let high_scores = {
350+
let mut high_scores = BTreeMap::new();
351+
for student in &students_data {
352+
let mut subjects = Vec::new();
353+
for score in &student.scores {
354+
if score.score >= 85 {
355+
subjects.push(score.subject);
356+
}
357+
}
358+
high_scores.insert(&student.name, subjects);
359+
}
360+
high_scores
361+
};
362+
// ↓ 等价于 ↓
363+
// use comprehension!
364+
let high_scores = b_tree_map![
365+
&student.name =>
366+
vector![score.subject for score in &student.scores if score.score >= 85]
367+
for student in &students_data
368+
];
369+
370+
assert_eq!(
371+
high_scores,
372+
BTreeMap::from([
373+
(&"Alice".to_string(), vec!["Math", "English"]),
374+
(&"Bob".to_string(), vec!["English"])
375+
])
376+
);
377+
```

README.md

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,3 +261,128 @@ b_tree_set! : insert() to add elements
261261
hash_map! : insert() to add key-value pairs
262262

263263
b_tree_map! : insert() to add key-value pairs
264+
265+
266+
# some real examples
267+
268+
```rust
269+
// create a 3x3 matrix
270+
let matrix = vector![
271+
vector![i * 3 + j + 1 for j in 0..3]
272+
for i in 0..3
273+
];
274+
275+
// transpose the matrix
276+
let transposed = vector![
277+
vector![row[i]
278+
for row in matrix.iter()]
279+
for i in 0..3
280+
];
281+
// matrix is alive
282+
assert_eq!(matrix, vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]);
283+
assert_eq!(
284+
transposed,
285+
vec![vec![1, 4, 7], vec![2, 5, 8], vec![3, 6, 9]]
286+
);
287+
```
288+
289+
290+
```rust
291+
#[derive(Debug, PartialEq, Eq)]
292+
struct Score {
293+
subject: &'static str,
294+
score: u8,
295+
}
296+
#[derive(Debug, PartialEq, Eq)]
297+
struct Student {
298+
name: String,
299+
age: u8,
300+
scores: Vec<Score>,
301+
}
302+
303+
let students_data = [
304+
Student {
305+
name: "Alice".to_string(),
306+
age: 20,
307+
scores: vec![
308+
Score {
309+
subject: "Math",
310+
score: 95,
311+
},
312+
Score {
313+
subject: "English",
314+
score: 88,
315+
},
316+
],
317+
},
318+
Student {
319+
name: "Bob".to_string(),
320+
age: 21,
321+
scores: vec![
322+
Score {
323+
subject: "Math",
324+
score: 78,
325+
},
326+
Score {
327+
subject: "English",
328+
score: 85,
329+
},
330+
],
331+
},
332+
];
333+
334+
// use for loop
335+
let math_scores: HashMap<&String, u8> = {
336+
let mut math_scores = HashMap::new();
337+
for student in &students_data {
338+
for score in &student.scores {
339+
if score.subject == "Math" {
340+
math_scores.insert(&student.name, score.score);
341+
}
342+
}
343+
}
344+
math_scores
345+
};
346+
// ↓ is equivalent to ↓
347+
// use comprehension!
348+
let math_scores: HashMap<&String, u8> = hash_map![
349+
&student.name => score.score
350+
for student in &students_data
351+
for score in &student.scores if score.subject == "Math"
352+
];
353+
354+
assert_eq!(
355+
math_scores,
356+
HashMap::from([(&"Alice".to_string(), 95), (&"Bob".to_string(), 78)])
357+
);
358+
359+
// use for loop
360+
let high_scores = {
361+
let mut high_scores = BTreeMap::new();
362+
for student in &students_data {
363+
let mut subjects = Vec::new();
364+
for score in &student.scores {
365+
if score.score >= 85 {
366+
subjects.push(score.subject);
367+
}
368+
}
369+
high_scores.insert(&student.name, subjects);
370+
}
371+
high_scores
372+
};
373+
// ↓ is equivalent to ↓
374+
// use comprehension!
375+
let high_scores = b_tree_map![
376+
&student.name =>
377+
vector![score.subject for score in &student.scores if score.score >= 85]
378+
for student in &students_data
379+
];
380+
381+
assert_eq!(
382+
high_scores,
383+
BTreeMap::from([
384+
(&"Alice".to_string(), vec!["Math", "English"]),
385+
(&"Bob".to_string(), vec!["English"])
386+
])
387+
);
388+
```

src/lib.rs

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,138 @@
270270
//! hash_map! : insert() to add key-value pairs
271271
//!
272272
//! b_tree_map! : insert() to add key-value pairs
273+
//!
274+
//! # some real examples
275+
//!
276+
//! ```rust
277+
//! use better_comprehension::vector;
278+
//! use std::collections::{HashMap, BTreeMap};
279+
//! // create a 3x3 matrix
280+
//! let matrix = vector![
281+
//! vector![i * 3 + j + 1 for j in 0..3]
282+
//! for i in 0..3
283+
//! ];
284+
//!
285+
//! // transpose the matrix
286+
//! let transposed = vector![
287+
//! vector![row[i]
288+
//! for row in matrix.iter()]
289+
//! for i in 0..3
290+
//! ];
291+
//! // matrix is alive
292+
//! assert_eq!(matrix, vec![vec![1, 2, 3],
293+
//! vec![4, 5, 6],
294+
//! vec![7, 8, 9]]);
295+
//! assert_eq!(
296+
//! transposed,
297+
//! vec![vec![1, 4, 7],
298+
//! vec![2, 5, 8],
299+
//! vec![3, 6, 9]]
300+
//! );
301+
//! ```
302+
//!
303+
//! ```rust
304+
//! use better_comprehension::{hash_map, b_tree_map, vector};
305+
//! use std::collections::{HashMap, BTreeMap};
306+
//! #[derive(Debug, PartialEq, Eq)]
307+
//! struct Score {
308+
//! subject: &'static str,
309+
//! score: u8,
310+
//! }
311+
//! #[derive(Debug, PartialEq, Eq)]
312+
//! struct Student {
313+
//! name: String,
314+
//! age: u8,
315+
//! scores: Vec<Score>,
316+
//! }
317+
//!
318+
//! let students_data = [
319+
//! Student {
320+
//! name: "Alice".to_string(),
321+
//! age: 20,
322+
//! scores: vec![
323+
//! Score {
324+
//! subject: "Math",
325+
//! score: 95,
326+
//! },
327+
//! Score {
328+
//! subject: "English",
329+
//! score: 88,
330+
//! },
331+
//! ],
332+
//! },
333+
//! Student {
334+
//! name: "Bob".to_string(),
335+
//! age: 21,
336+
//! scores: vec![
337+
//! Score {
338+
//! subject: "Math",
339+
//! score: 78,
340+
//! },
341+
//! Score {
342+
//! subject: "English",
343+
//! score: 85,
344+
//! },
345+
//! ],
346+
//! },
347+
//! ];
348+
//!
349+
//! // use for loop
350+
//! let math_scores: HashMap<&String, u8> = {
351+
//! let mut math_scores = HashMap::new();
352+
//! for student in &students_data {
353+
//! for score in &student.scores {
354+
//! if score.subject == "Math" {
355+
//! math_scores.insert(&student.name, score.score);
356+
//! }
357+
//! }
358+
//! }
359+
//! math_scores
360+
//! };
361+
//! // ↓ is equivalent to ↓
362+
//! // use comprehension!
363+
//! let math_scores: HashMap<&String, u8> = hash_map![
364+
//! &student.name => score.score
365+
//! for student in &students_data
366+
//! for score in &student.scores if score.subject == "Math"
367+
//! ];
368+
//!
369+
//! assert_eq!(
370+
//! math_scores,
371+
//! HashMap::from([(&"Alice".to_string(), 95),
372+
//! (&"Bob".to_string(), 78)]));
373+
//!
374+
//! // use for loop
375+
//! let high_scores = {
376+
//! let mut high_scores = BTreeMap::new();
377+
//! for student in &students_data {
378+
//! let mut subjects = Vec::new();
379+
//! for score in &student.scores {
380+
//! if score.score >= 85 {
381+
//! subjects.push(score.subject);
382+
//! }
383+
//! }
384+
//! high_scores.insert(&student.name, subjects);
385+
//! }
386+
//! high_scores
387+
//! };
388+
//! // ↓ is equivalent to ↓
389+
//! // use comprehension!
390+
//! let high_scores = b_tree_map![
391+
//! &student.name =>
392+
//! vector![score.subject
393+
//! for score in &student.scores if score.score >= 85]
394+
//! for student in &students_data
395+
//! ];
396+
//!
397+
//! assert_eq!(
398+
//! high_scores,
399+
//! BTreeMap::from([
400+
//! (&"Alice".to_string(), vec!["Math", "English"]),
401+
//! (&"Bob".to_string(), vec!["English"])
402+
//! ])
403+
//! );
404+
//! ```
273405
274406
// #![allow(unused, dead_code)]
275407
use proc_macro::TokenStream as TS;

0 commit comments

Comments
 (0)