За това предизвикателство, ще трябва да се сборите с един макрос. Ще се опитаме да нахакаме един list/set comprehension в Rust, който изглежда що-годе като този за хаскел:
let items: Vec<_> = collect![x * y * z; x <- 1..4, y <- vec![1, 3], z <- Some(1)];
assert_eq!(vec![1, 3, 2, 6, 3, 9], items);
let items: HashSet<_> = collect![x * y * z; x <- 1..4, y <- vec![1, 3], z <- Some(1)];
let mut vec_items = Vec::from_iter(items.into_iter());
vec_items.sort();
assert_eq!(vec![1, 2, 3, 6, 9], vec_items);
В горния пример, със x <- 1..4 и y <- vec![1, 3], стойността на x първо ще мине през 1, умножено по стойността 1 на y, после 1, умножено по стойността 3 на y. След това, x ще мине през 2, 3, за стойности на y 1, 3. И т.н. за всяка следваща дефиниция. Basically, погрижете се този пример да връща този резултат:
let items: Vec<_> = collect![x * y * z; x <- 1..4, y <- vec![1, 3]];
assert_eq!(vec![1, 3, 2, 6, 3, 9], items);
Дефиницията ще започне така:
#[macro_export]
macro_rules! collect {
// ....
}
Задължително е да сложите отгоре #[macro_export].
Винаги ще присъства поне една <променлива> <- <колекция> част. Може да е само една.
Забележете, че в зависимост от типа на резултата, очакваме макроса да върне различни неща. Тоест, в крайна сметка, макроса трябва да викне collect() на някакъв итератор.
Няма да тестваме с trailing запетайки, така че не се притеснявайте за това. Няма и да тестваме с различни типове променливи, само с цели числа (не целим да упражните аритметика или конвертирания, само писане на макроси).
Силно ви съветваме да минете отново през лекцията за макроси, за да си припомните всякакви странни hint-ове. Четете компилаторни грешки внимателно, и започнете с най-простия пример, усложнявайте постепенно.
Compiling solution v0.1.0 (file:///tmp/d20180119-3040-12riidi/solution)
Finished dev [unoptimized + debuginfo] target(s) in 3.44 secs
Running target/debug/deps/solution-ce0b707f0d16a543
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Running target/debug/deps/solution_test-370f3a629b3a1ef4
running 3 tests
test solution_test::test_different_collections ... ok
test solution_test::test_multiple_sources ... ok
test solution_test::test_single_source ... ok
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Doc-tests solution
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Compiling solution v0.1.0 (file:///tmp/d20180119-3040-131nzg0/solution)
Finished dev [unoptimized + debuginfo] target(s) in 3.39 secs
Running target/debug/deps/solution-ce0b707f0d16a543
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Running target/debug/deps/solution_test-370f3a629b3a1ef4
running 3 tests
test solution_test::test_different_collections ... ok
test solution_test::test_multiple_sources ... ok
test solution_test::test_single_source ... ok
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Doc-tests solution
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Compiling solution v0.1.0 (file:///tmp/d20180119-3040-1rii11a/solution)
Finished dev [unoptimized + debuginfo] target(s) in 2.78 secs
Running target/debug/deps/solution-ce0b707f0d16a543
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Running target/debug/deps/solution_test-370f3a629b3a1ef4
running 3 tests
test solution_test::test_different_collections ... ok
test solution_test::test_multiple_sources ... ok
test solution_test::test_single_source ... ok
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Doc-tests solution
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Compiling solution v0.1.0 (file:///tmp/d20180119-3040-12fu8pf/solution)
Finished dev [unoptimized + debuginfo] target(s) in 2.84 secs
Running target/debug/deps/solution-ce0b707f0d16a543
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Running target/debug/deps/solution_test-370f3a629b3a1ef4
running 3 tests
test solution_test::test_different_collections ... ok
test solution_test::test_multiple_sources ... ok
test solution_test::test_single_source ... ok
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Doc-tests solution
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Compiling solution v0.1.0 (file:///tmp/d20180119-3040-qc2vym/solution)
Finished dev [unoptimized + debuginfo] target(s) in 3.6 secs
Running target/debug/deps/solution-ce0b707f0d16a543
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Running target/debug/deps/solution_test-370f3a629b3a1ef4
running 3 tests
test solution_test::test_different_collections ... ok
test solution_test::test_multiple_sources ... ok
test solution_test::test_single_source ... ok
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Doc-tests solution
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out