Skip to content

Commit 89ed56d

Browse files
1.3系列提交, 修复了集合推导式中的字段访问问题
1 parent 06ce89a commit 89ed56d

File tree

3 files changed

+98
-8
lines changed

3 files changed

+98
-8
lines changed

src/eager_evaluation.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,15 @@ pub(crate) fn handle_nested_loops<'a>(
4646
Expr::MethodCall(_) => match crate::is_iter(iterable) {
4747
true => quote! { #iterable },
4848
_ => panic!(
49-
"please ensure the first method call is iter(): {:?}",
49+
"please ensure the first method call is iter(): \n{:#?}",
5050
iterable
5151
),
5252
},
5353
Expr::Paren(expr) => {
5454
let iterable = &*expr.expr;
5555
quote! { #iterable }
5656
}
57-
_ => panic!("type is not supported: {:?}", iterable),
57+
_ => panic!("type is not supported: \n{:#?}", iterable),
5858
};
5959

6060
// 根据是否有if条件生成循环代码

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ use syn::{ExprMethodCall, visit::Visit};
358358
impl<'ast> Visit<'ast> for IterMethodCallFinder {
359359
fn visit_expr_method_call(&mut self, node: &'ast ExprMethodCall) {
360360
match *node.receiver {
361-
syn::Expr::Path(_) => {
361+
syn::Expr::Path(_) | syn::Expr::Field(_) => {
362362
if node.method == "iter" {
363363
self.is_iter = true;
364364
}

src/main.rs

Lines changed: 95 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#![allow(unused)]
12
use better_comprehension::{
23
b_tree_map, b_tree_set, binary_heap, hash_map, hash_set, iterator_ref, linked_list, vec_deque,
34
vector,
@@ -19,6 +20,7 @@ fn main() {
1920
test_nested_comprehension();
2021
test_ownership_handling();
2122
test_option();
23+
some_real_example_2();
2224
}
2325

2426
fn test_vec() {
@@ -355,15 +357,103 @@ fn test_ref_iterator() {
355357
fn test_option() {
356358
let vec = [Some("1".to_string()), None, Some("3".to_string())];
357359

358-
let _result = vector![
360+
let result = vector![
359361
x.clone()
360362
for x in vec.iter().flatten()
361363
];
362364

363-
let mut result = Vec::new();
364-
for x in vec.iter().flatten() {
365-
result.push(x.clone());
366-
}
365+
let result = {
366+
let mut result = Vec::new();
367+
for x in vec.iter().flatten() {
368+
result.push(x.clone());
369+
}
370+
result
371+
};
367372

368373
assert_eq!(result, vec!["1".to_string(), "3".to_string()]);
369374
}
375+
376+
fn some_real_example_1() {
377+
// 创建3x3矩阵
378+
let matrix = vector![
379+
vector![i * 3 + j + 1 for j in 0..3]
380+
for i in 0..3
381+
];
382+
383+
// 矩阵转置
384+
let transposed = vector![
385+
vector![row[i]
386+
for row in matrix.iter()]
387+
for i in 0..3
388+
];
389+
// matrix is alive
390+
assert_eq!(matrix, vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]);
391+
assert_eq!(
392+
transposed,
393+
vec![vec![1, 4, 7], vec![2, 5, 8], vec![3, 6, 9]]
394+
);
395+
}
396+
397+
fn some_real_example_2() {
398+
#[derive(Debug, PartialEq, Eq)]
399+
struct Score {
400+
subject: String,
401+
score: u8,
402+
}
403+
#[derive(Debug, PartialEq, Eq)]
404+
struct Student {
405+
name: String,
406+
age: u8,
407+
scores: Vec<Score>,
408+
}
409+
410+
let students_data = [
411+
Student {
412+
name: "Alice".to_string(),
413+
age: 20,
414+
scores: vec![
415+
Score {
416+
subject: "Math".to_string(),
417+
score: 95,
418+
},
419+
Score {
420+
subject: "English".to_string(),
421+
score: 88,
422+
},
423+
],
424+
},
425+
Student {
426+
name: "Bob".to_string(),
427+
age: 21,
428+
scores: vec![
429+
Score {
430+
subject: "Math".to_string(),
431+
score: 78,
432+
},
433+
Score {
434+
subject: "English".to_string(),
435+
score: 85,
436+
},
437+
],
438+
},
439+
];
440+
441+
// for student in &students_data {
442+
// for score in &student.scores {
443+
// if score.subject == "Math" {
444+
// println!("{}: {}", student.name, score.score);
445+
// }
446+
// }
447+
// }
448+
449+
let math_scores: HashMap<&String, u8> = hash_map![
450+
&student.name => score.score
451+
for student in &students_data
452+
for score in &student.scores if score.subject == "Math"
453+
];
454+
455+
assert_eq!(
456+
math_scores,
457+
HashMap::from([(&"Alice".to_string(), 95), (&"Bob".to_string(), 78)])
458+
);
459+
}

0 commit comments

Comments
 (0)