[−][src]Macro comprehension::iter
iter!() { /* proc-macro */ }
Iterator comprehension
The syntax is similar to Haskell's list comprehension.
Basic syntax is as: [<expr>; <quals>, ...]
Examples
<pat> <- <expr>
binds items of expr
to pat
.
expr
must have .into_iter()
method.
iter![x * x; x <- 0..10]; // => [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
You can also use patterns.
iter![x * y; (x, y) <- vec![(1, 1), (2, 3), (4, 5)]]; // => [1, 6, 20]
<expr>
filters item.
expr
must have type bool
.
fn gcd(a: i32, b: i32) -> i32 { if b == 0 { a } else { gcd(b, a % b) } } iter![(i, j); i <- 1.., j <- 1..i, gcd(i, j) == 1].take(10); // => [(1, 1), (2, 1), (2, 2), (2, 3), (2, 4), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5)]
let <pat> = <expr>
introduces a binding.
iter![(i, j); i <- 1.., let k = i * i, j <- 1..=k].take(10); // => [(1, 1), (2, 1), (2, 2), (2, 3), (2, 4), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5)]
If there is no binding to iterator, just one element will be returned (same as Haskell's behaviour).
iter![1; ]; // => [1] iter![1; false]; // => [] iter![1; true]; // => [1]