简介
本文介绍如何在Rust中初始化负责的结构,比较常用的有pub fn new()的形式和建造者模式和Default模式。
pub fn new()
在Rust中初始化一个结构体最常用的就是使用pub fn new()的方式,一般格式如下:
pub fn new() -> Self {
Self {
// init
}
}
这种方式非常的易用并且简洁明了,当时这个只适用于简答的结构体,对于负责的结构体会有一个非常长的参数列表,例如:
impl YakShaver {
pub fn new(clipper_size: u32, gas_powered_clippers: bool, solar_powered_clippers: bool, color_to_dye_yak: &str) -> Self {
// Body is irrelevant
}
}
let yak_shaver = YakShaver::new(3, false, true, "magenta");
同时也会带来另外一个问题,当需要给YakShaver添加新的成员变量的时候,就需要修改new方法,导致所有调用new方法的地方都需要修改,例如添加一个 clipper_color,
impl YakShaver {
pub fn new(...same as above..., clipper_color: &str) -> Self {
// Body is irrelevant
}
}
let yak_shaver = YakShaver::new(3, false, true, "magenta", "red");
此外这样还有一个问题,所有调用者都需要指定一个颜色,即使99%+的用户只需使用一个默认的黑色,也需要显示的指定。
建造者模式
建造者模式非常的整洁,因为使用建造者模式不需要指定所有的成员变量,只需要指定需要的即可。
pub struct YakShaverBuilder {
clipper_size: u32,
gas_powered_clippers: bool,
solar_powered_clippers: bool,
color_to_dye_yak: String,
clipper_color: String,
}
impl YakShaverBuilder {
pub fn new() -> Self {
Self {
clipper_size: 3,
gas_powered_clippers: false,
solar_powered_clippers: true,
color_to_dye_yak: String::from("brown"),
clipper_color: String::from("black"),
}
}
pub fn clipper_size(mut self, v: u32) -> Self {
self.clipper_size = v;
self
}
pub fn gas_powered_clippers(mut self, v: bool) -> Self {
self.gas_powered_clippers = v;
self
}
pub fn solar_powered_clippers(mut self, v: bool) -> Self {
self.solar_powered_clippers = v;
self
}
pub fn color_to_dye_yak(mut self, v: String) -> Self {
self.color_to_dye_yak = v;
self
}
pub fn clipper_color(mut self, v: String) -> Self {
self.clipper_color = v;
self
}
pub fn build(self) -> YakShaver {
YakShaver {
clipper_size: self.clipper_size,
gas_powered_clippers: self.gas_powered_clippers,
solar_powered_clippers: self.solar_powered_clippers,
color_to_dye_yak: self.color_to_dye_yak,
clipper_color: self.clipper_color,
}
}
}
let yak_shaver = YakShaverBuilder::new()
.clipper_size(4)
.color_to_dye_yak(String::from("hot pink"))
.clipper_color(String::from("red"))
.build();
Default模式
Rust中提供了Defaulttrait,实现Defaulttrait可以使用默认值来初始化struct。
#[derive(Default, Debug)]
pub struct YakShaverInit {
pub clipper_size: u32,
pub gas_powered_clippers: bool,
pub solar_powered_clippers: bool,
pub color_to_dye_yak: String,
pub clipper_color: String,
}
let yak_shaver = YakShaverInit {
clipper_size: 4,
color_to_dye_yak: String::from("hot pink"),
clipper_color: String::from("red"),
..Default::default(),
}
let yak_shaver_default = Default::default();
使用Default模式的好处是我们只需要再实现Defaulttrait,当初始化struct的时候,只需要提供我们需要的参数即可。