I agree that is a macro like your `if_matches` examples were possible, it would be a reasonable solution, including conferring the right scope for `a` and `b`.
It is completely unclear to me how to implement it though. What does "use_more_macros line" mean? Thanks, Oren. On Mon, Sep 23, 2013 at 2:06 PM, Huon Wilson <[email protected]> wrote: > On 23/09/13 20:52, Jason Fager wrote: > > Doesn't seem like enough bang for the buck to me. In your first example you > save 3 vertical lines but get a really wide one in return, and lose some > indentation > levels but add more syntax and conceptual overhead to the language. > > Might be my lack of imagination, but the feature doesn't seem to expand > out to many other use cases, either. > > Your second case you could write as: > > let foo = get_option("foo"); > let bar = get_option("bar"); > if foo.is_some() && bar.is_some() { > use(foo.unwrap(), bar.unwrap()); > } > > > It's also possible to write a `matches` macro: > > macro_rules! matches { > ($e:expr ~ $($p:pat)|*) => { > match $e { > $($p)|* => true, > _ => false > } > } > } > > fn main() { > let a = Some(1); > let b = Some(2); > > if matches!((a,b) ~ (Some(_), Some(_))) { > println("whatever"); > } > } > > (This has the drawback that accidentally (or otherwise) using a pattern > that always matches, e.g. `matches!((a,b) ~ (_,_))` gives a error message > about the `_ => false` arm being unreachable, which isn't particularly > intuitive.) > > Following the use-more-macros line, one could modify the above to give > something like > > if_matches!(foo ~ (Some(a), Some(b)) => { > // use a, b > }) > > by adding an $expr argument to use instead of `true` and replacing the > false arm with `{}`. Note: this *may* break when match-var-hygiene is > implemented (https://github.com/mozilla/rust/issues/9384), I'm not sure. > > Huon > > > _______________________________________________ > Rust-dev mailing list > [email protected] > https://mail.mozilla.org/listinfo/rust-dev > >
_______________________________________________ Rust-dev mailing list [email protected] https://mail.mozilla.org/listinfo/rust-dev
