What #[derive(Constructor)] generates
A common pattern in Rust is to create a static constructor method called
new
. This method is can then be used to create an instance of a struct. You
can now derive this method by using #[derive(Constructor)]
, even though
Constructor
it is not an actual trait. The generated new
method is very
similar to the from
method when deriving From
, except that it takes multiple
arguments instead of a tuple.
1 Tuple structs
When deriving Constructor
for a tuple struct with a two fields like this:
#[derive(Constructor)] struct MyInts(i32, i32);
Code like this will be generated:
impl MyInts { pub fn new(__0: i32, __1: i32) -> MyInts { MyInts(__0, __1) } }
The generated code is similar for more or less fields.
2 Regular structs
For regular structs almost the same code is generated as for tuple structs except that it assigns the fields differently.
#[derive(Constructor)] struct Point2D { x: i32, y: i32, }
Code like this will be generated:
impl Point2D { pub fn new(x: i32, y: i32) -> Point2D { Point2D { x: x, y: y } } }
The generated code is similar for more or less fields.
3 Enums
Currently Constructor
cannot be derived for enums. This is because the new
method might then need to have a different number of arguments. This is
currently not supported by Rust. So this functionality will not be added until
this RFC (or a similar one) is
accepted and implemented.