This seems to be similar to the approach taken by Go, which seems simple and to the point. I presume taking it a step further and making new() be overloadable is out of the question?
-- Ziad On Tue, Aug 14, 2012 at 4:35 PM, Brian Anderson <[email protected]>wrote: > Hey. > > We need a consistent naming scheme for constructor functions. The current > convention is to give these functions the same name as the type they > create, so `core::dvec::dvec` is created by calling `core::dvec::dvec()`. > > We are in the process of changing our naming convention for types (as well > as variants - which will eventually be types) to camel case. So very soon > now your `Option` type will be created by calling `Some(foo)`, because > `Some` is both a type and a constructor. Functions, on the other hand, will > continue to have the lowercase + underscore convention. > > This leaves the question of what to call functions that are constructors. > We could continue to name them after their types, but it's a little weird: > > fn DVec() -> DVec { ... } > > So now I need an alternate constructor. What do I call it? > > fn DVecWithParam(arg: foo) -> DVec{ ... } > > No other functions would follow such conventions. This is also harder to > write reliable lint checks for. I'm disinclined to do this. > > Naming them after their type, but lowercase, is crummy in other ways: > > type DVec = ...; > > fn dvec() -> DVec { ... } > > Now to use DVec you're going to import two symbols: `import dvec::{DVec, > dvec}`. All those dvecs ... so unsightly. This is mostly the scheme we will > be left with after the conversion to camel case types, but I hope we can > come up with something better before 0.4. > > One option: > > Constructors are called `new`, which will be freed up from the keyword > list with the removal of classes. If there are multiple constructors in a > module then they are descriptively disambiguated, as in `new_petunia` or > `new_petunia_with_vase`. Most modules define one public type they are > concerned with, so a simple `new` should suffice. > > The general pattern for defining a new 'object' would be: > > mod belt_buckle { > > struct BeltBuckle { ... } > > impl BeltBuckle { > } > > fn new() -> BeltBuckle { ... } > > fn new_with_gold_plating(plating: GoldPlating) -> BeltBuckle { > ... > } > } > > Then to use it: > > import my_crate::belt_buckle; > > let my_belt_buckle = belt_buckle::new(); > > You will mostly not import the constructor because it will need to be > disambiguated from all the other 'new's in the world. > > Regards, > Brian > > ______________________________**_________________ > Rust-dev mailing list > [email protected] > https://mail.mozilla.org/**listinfo/rust-dev<https://mail.mozilla.org/listinfo/rust-dev> >
_______________________________________________ Rust-dev mailing list [email protected] https://mail.mozilla.org/listinfo/rust-dev
