In Rust, "constructors" are just a convention:
fn main() { impl<T> Vec<T> { pub fn new() -> Vec<T> { ... } } }impl<T> Vec<T> { pub fn new() -> Vec<T> { ... } }
Constructors are static (no self
) inherent methods for the type that they
construct. Combined with the practice of
fully importing type names, this convention leads to
informative but concise construction:
use vec::Vec; // construct a new vector let mut v = Vec::new();
This convention also applied to conversion constructors (prefix from
rather
than new
).
struct
s with defaults. [FIXME: needs RFC]Given the struct
pub struct Config { pub color: Color, pub size: Size, pub shape: Shape, }
provide a constructor if there are sensible defaults:
fn main() { impl Config { pub fn new() -> Config { Config { color: Brown, size: Medium, shape: Square, } } } }impl Config { pub fn new() -> Config { Config { color: Brown, size: Medium, shape: Square, } } }
which then allows clients to concisely override using struct
update syntax:
Config { color: Red, .. Config::new() };
See the guideline for field privacy for
discussion on when to create such "passive" struct
s with public
fields.