Skip to content

Instantly share code, notes, and snippets.

@edef1c
Created February 17, 2019 16:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save edef1c/10318f8bbf721ebe83438bd2f520aeef to your computer and use it in GitHub Desktop.
Save edef1c/10318f8bbf721ebe83438bd2f520aeef to your computer and use it in GitHub Desktop.
for .. { .. } else { .. } macro for Rust
macro_rules! for_expr {
( $lhs:pat in $iter:ident $body:block else $else:block ) => {
for_expr!($lhs in ($iter) $body else $else)
};
( $lhs:pat in ($iter:expr) $body:block else $else:block ) => {{
let mut iter = ::core::iter::IntoIterator::into_iter($iter);
if let Some(mut item) = iter.next() {
loop {
let $lhs = item;
let result = $body;
item = if let Some(i) = iter.next() {
i
} else {
break result;
};
}
} else $else
}}
}
fn main() {
// let values: &[i32] = &[2, 3, 5];
let values: &[i32] = &[];
let result = for_expr!(num in values {
num * 3
} else {
-1
});
println!("{}", result);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment