阅读 1337

Rust 初始化模式

简介

本文介绍如何在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的时候,只需要提供我们需要的参数即可。

文章分类
后端
文章标签