代码之家  ›  专栏  ›  技术社区  ›  Joe

使用ENVICE时,如何用匹配结果填充结构实例?

  •  2
  • Joe  · 技术社区  · 7 年前

    我想用匹配环境变量的结果填充可变变量:

    struct Environment {
        some_env_variable_1: String,
        some_env_variable_2: String,
        some_env_variable_3: String,
        some_env_variable_4: String,
    }
    
    match envy::from_env::<Environment>() {
        Ok(environment) => println!("{:#?}", environment),
        Err(error) => panic!("{:#?})", error),
    };
    
    //where I'm stuck
    let mut e = Environment {
        some_env_variable_1: // want this to be from match
    };
    
    1 回复  |  直到 7 年前
        1
  •  4
  •   Shepmaster Tim Diekmann    7 年前

    您正在调用envy方法,该方法为您完成所有解析和填充。问题是你 它只在 match :

    match envy::from_env::<Environment>() {
        Ok(environment) => println!("{:#?}", environment), // gone now
        Err(error) => panic!("{:#?})", error),
    };
    

    你不需要扔掉它:

    let environment = match envy::from_env::<Environment>() {
        Ok(environment) => {
            println!("{:#?}", environment);
            environment // Now the entire `match` evaluates to `environment` 
        }
        Err(error) => panic!("{:#?})", error),
    };
    

    expect :

    let environment: Environment = envy::from_env()
        .expect("Couldn't parse environment");
    
    println!("{:#?}", environment);
    

    完整示例:

    extern crate serde;
    #[macro_use]
    extern crate serde_derive;
    extern crate envy;
    
    #[derive(Debug, Deserialize)]
    struct Environment {
        username: String,
        port: u16,
    }
    
    fn main() {
        let mut environment: Environment = envy::from_env()
            .expect("Couldn't parse environment variables");
    
        println!("{:#?}", environment);
    }
    
    $ USERNAME=overflow PORT=8787 cargo run
    
    Environment {
        username: "overflow",
        port: 8787
    }