Custom extractors in Rust?


#1

I like scala’s extractors (“unapply”) and I think they would be a very nice addition to Rust. I wanted to know if there was some appetite or if they were already proposed but have known issues that would make them a bad fit for Rust.

The gist, for those not familiar with scala, would be to define a custom way to destructure types so they can be used in match. As an example, there could be a

    trait Destructure<Args> {
        fn destructure(&self) -> Option<Args>; // same "magic used
           // in the new Fn/FnMut/FnOnce traits where Args is a tuple
          // of any arity that contains the results of the destructuring
    }

and “destructure” could be called when destructuring that type:

    match instance_of_my_type {
        (a, b, c) /* Args */ => (),
        // ....
    }

Motivation for this would be creating a general and elegant solution to scenarios like this one: http://www.reddit.com/r/rust/comments/2d7rrj/bit_level_pattern_matching/ or even a general solution to destructuring of smart pointers as in this other thread http://www.reddit.com/r/rust/comments/2cjii7/matching_with_smart_pointers_is_unergonomic/