應(yīng)用配置在應(yīng)用中是比較基礎(chǔ)的機(jī)制落午,本文以示例的方式店茶,講解在Rust語(yǔ)言中,如果實(shí)現(xiàn)一個(gè)可擴(kuò)展的配置類嵌赠。
- 1塑荒、定義結(jié)構(gòu)體
首先我們需要定義一個(gè)配置類結(jié)構(gòu)體,用于描述應(yīng)用中需要配置的配置項(xiàng)姜挺。
#[derive(Debug, Clone)]
pub struct Config<Flags>{
pub host:String,
pub port:u32,
pub flags:Flags,
}
Flags用于定義后續(xù)可能的擴(kuò)展配置齿税,host和port為示例,根據(jù)應(yīng)用適用場(chǎng)景定義的基礎(chǔ)的配置項(xiàng)炊豪。
- 2凌箕、定義默認(rèn)配置
為了降低配置工作,讓配置類實(shí)現(xiàn)Default trait词渤,為應(yīng)用提供默認(rèn)配置牵舱。
impl<Flags> Default for Config<Flags> where Flags:Default{
fn default() -> Self {
Self {
host: Default::default(),
port: Default::default(),
flags: Default::default()
}
}
}
實(shí)現(xiàn)Defualt trait時(shí),需要對(duì)Flags進(jìn)行約束缺虐,指定為Flags是實(shí)現(xiàn)Default trait的類型芜壁。Config實(shí)現(xiàn)了Default trait,同時(shí)要求
它的子項(xiàng)也實(shí)現(xiàn)Default trait高氮。在rust中慧妄,該要求比較常見(jiàn),例如:Debug和Clone trait等剪芍,都有類似要求塞淹。
當(dāng)不需要對(duì)Config進(jìn)行擴(kuò)展時(shí),F(xiàn)lags可以指定為()罪裹,如下:
let config = Config::<()>::default();
- 3饱普、通過(guò)擴(kuò)展配置項(xiàng)創(chuàng)建配置
通過(guò)配置項(xiàng)运挫,創(chuàng)建Config實(shí)例
impl<Flags> Config<Flags>{
pub fn from_flags(flags:Flags)->Self{
let default = Config::<()>::default();
Self {
flags,
host:default.host,
port:default.port,
}
}
}
- 4、完整代碼及測(cè)試
#[derive(Debug, Clone)]
pub struct Config<Flags>{
pub host:String,
pub port:u32,
pub flags:Flags,
}
impl<Flags> Config<Flags>{
pub fn from_flags(flags:Flags)->Self{
let default = Config::<()>::default();
Self {
flags,
host:default.host,
port:default.port,
}
}
}
impl<Flags> Default for Config<Flags> where Flags:Default{
fn default() -> Self {
Self { host: Default::default(), port: Default::default(), flags: Default::default() }
}
}
#[test]
fn test_default_config(){
let config = Config::<()>::default();
println!("The config is {:?}", config);
}
#[test]
fn test_from_flags(){
#[derive(Debug, Clone)]
struct Attrs{
id:u32,
name:String,
}
let attrs = Attrs{id:12, name:"bob".to_string()};
let config = Config::from_flags(attrs);
println!("The config is {:?}", config);
println!("The id in config is {:?}", config.flags.id);
println!("The name in config is {:?}", config.flags.name);
}