Hi everyone,

It's been proposed that we place enum variants under the enum itself. That is:

    enum Option<T> {
        None,
        Some<T>,
    }

Would be accessed as:

    fn main() {
        let x = Option::None;
    }

The advantages of this are:

* Rust programmers very frequently generate ad-hoc prefixes to group variants under their namespaces. Prefixes seem to me to be the sincerest form of feature request for namespaces. (See Objective-C or Gecko `NSFoo`, GLib `g_`, etc.)

* You can get the old behavior with `use` or `pub use`.

* Other modules can import all variants belonging to an enum by simply writing (say) `use option::Option::*;`. This is a common thing to want and would, for example, eliminate all the `use obsolete::{ObsoleteFoo, ObsoleteBar, ...}` cruft in `parser.rs`. Note that Haskell introduced special notation for this into their `import` statements.

* C++11 went the direction of enum variant namespacing with `enum class`. I worry we may be making the same mistake that led them to introduce two incompatible versions of enums.

* This may clean up the `use core::option::Option` stuttering in the `option` module (and in a few related cases, like `std::list::List`). Instead of having types like `std::option::Option`, variants like `std::option::None`, and methods like `std::option::Option::is_none`, we could have simply `std::Option`, `std::Option::None`, and `std::Option::is_none` respectively. This seems to read nicer.

The disadvantages are:

* `::` will show up for many casual uses of enums. e.g.

    enum Color { Red, Green, Blue }
    fn main() {
        let x = Color::Red;
        match x {
            Color::Red => ...
            Color::Green => ...
            Color::Blue => ...
        }
    }

Thoughts? This would be a very late-stage change that will break pretty much all Rust code in existence, and it has disadvantages, but the advantages seem compelling enough to consider it...

Patrick
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to