Example 2: Defining a constructor function
In this section,
we'll be using another example to demonstrate
more of what derive-deftly
can do.
We'll be building a Constructor
template
to define a new()
function for a struct,
without having to write out all of its arguments.
Let's start with the following (struct-only) template:
#![allow(unused)] fn main() { use derive_deftly::define_derive_deftly; define_derive_deftly! { Constructor: impl<$tgens> $ttype where $twheres { pub fn new( $( $fname: $ftype , ) ) -> Self { Self { $( $fname , ) } } } } }
When you apply the above template to a type like this:
#![allow(unused)] fn main() { use derive_deftly::define_derive_deftly; define_derive_deftly! { Constructor: impl<$tgens> $ttype where $twheres { pub fn new( $( $fname: $ftype , ) ) -> Self { Self { $( $fname , ) } } } } use derive_deftly::Deftly; #[derive(Deftly)] #[derive_deftly(Constructor)] struct Ex<A> { a: f64, b: A, c: String } }
You'll get a constructor like this:
#![allow(unused)] fn main() { struct Ex<A> { a: f64, b: A, c: String } impl<A> Ex<A> { pub fn new( a: f64, b: A, c: String ) -> Self { Self { a, b, c } } } }
So far, there aren't any new techniques at work here. We'll add some more down below.