[−][src]Crate if_chain
This crate provides a single macro called if_chain!
.
if_chain!
lets you write long chains of nested if
and if let
statements without the associated rightward drift. It also supports multiple
patterns (e.g. if let Foo(a) | Bar(a) = b
) in places where Rust would
normally not allow them.
See the associated blog post for the background behind this crate.
Note about recursion limits
If you run into "recursion limit reached" errors while using this macro, try adding
ⓘThis example is not tested
#![recursion_limit = "1000"]
to the top of your crate.
Examples
Quick start
ⓘThis example is not tested
if_chain! { if let Some(y) = x; if y.len() == 2; if let Some(z) = y; then { do_stuff_with(z); } }
becomes
ⓘThis example is not tested
if let Some(y) = x { if y.len() == 2 { if let Some(z) = y { do_stuff_with(z); } } }
Fallback values with else
ⓘThis example is not tested
if_chain! { if let Some(y) = x; if let Some(z) = y; then { do_stuff_with(z) } else { do_something_else() } }
becomes
ⓘThis example is not tested
if let Some(y) = x { if let Some(z) = y { do_stuff_with(z) } else { do_something_else() } } else { do_something_else() }
Intermediate variables with let
ⓘThis example is not tested
if_chain! { if let Some(y) = x; let z = y.some().complicated().expression(); if z == 42; then { do_stuff_with(y); } }
becomes
ⓘThis example is not tested
if let Some(y) = x { let z = y.some().complicated().expression(); if z == 42 { do_stuff_with(y); } }
Multiple patterns
ⓘThis example is not tested
if_chain! { if let Foo(y) | Bar(y) | Baz(y) = x; let Bubbles(z) | Buttercup(z) | Blossom(z) = y; then { do_stuff_with(z) } }
becomes
ⓘThis example is not tested
match x { Foo(y) | Bar(y) | Baz(y) => match y { Bubbles(z) | Buttercup(z) | Blossom(z) => do_stuff_with(z) }, _ => {} }
Note that if you use a plain let
, then if_chain!
assumes that the
pattern is irrefutable (always matches) and doesn't add a fallback branch.
Macros
if_chain | Macro for writing nested |