On Sat, Aug 4, 2012 at 6:53 PM, Patrick Walton <pwal...@mozilla.com> wrote:
> On 08/02/2012 12:51 PM, Emmanuel Surleau wrote: > >> Hi, >> >> I'm new to rust, and I'm struggling to find an elegant way to work with >> default >> parameters. >> > > Generally we've been experimenting with method chaining to achieve things > like default and named parameters in Rust. See the task builder API for an > example: > > https://github.com/mozilla/**rust/blob/incoming/src/**libcore/task.rs#L197<https://github.com/mozilla/rust/blob/incoming/src/libcore/task.rs#L197> > > So I can see your use case being something like: > > let flag = Flag("verbose", "Maximum verbosity").short_name("v"); > > To implement this you'd write: > > struct Flag { > name: &str; > desc: &str; > short_name: option<&str>; > max_count: uint; > banner: option<&str>; > } > > // Constructor > fn Flag(name: &str, desc: &str) -> Flag { > Flag { > name: name, > desc: desc, > short_name: none, > max_count: 1, > banner: none > } > } > > impl Flag { > fn short_name(self, short_name: &str) -> Flag { > Flag { short_name: some(short_name) with self } > } > fn max_count(self, max_count: uint) -> Flag { > Flag { max_count: max_count with self } > } > fn banner(self, banner: &str) -> Flag { > Flag { banner: some(banner) with self } > } > } > > (Note that this depends on the functional record update "with" syntax > working for structs, which it doesn't yet.) > > If this style catches on it'd probably be nice to have a macro to generate > the mutators (fn short_name, fn max_count, fn banner). Then instead of the > "impl { ... }" above you'd write something like: > > make_setter!(Flag.short_name: option<&str>, WrapOption); > make_setter!(Flag.max_count: uint); > make_setter!(Flag.banner: option<&str>, WrapOption); > > (Assuming that WrapOption is a special flag to the macro to indicate that > the value should automatically be wrapped in "some"). > > How does this sound? > > Patrick > > Verbose. -- Matthieu
_______________________________________________ Rust-dev mailing list Rust-dev@mozilla.org https://mail.mozilla.org/listinfo/rust-dev