2017-10-18 90 views
2

我想填充一个可变变量相匹配的环境变量的结果:如何在使用嫉妒时使用匹配结果填充结构实例?

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 
}; 

回答

4

您正在调用哪一个做所有的分析和人口对你羡慕的方法。问题是,你扔掉的结果 - 这仅仅是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 
} 
+1

谢谢你这么多,却没有意识到,它把它扔在该行的末尾。我尝试了不那么习惯的方式,但没有阻止它,所以它仍然扔掉我猜。 – Joe

+1

@Joe要清楚的是,不是在{match}表达式之前放弃或不放弃的'{}',它是'let environment ='。 '好吧(环境)=>环境,'也可以。 (假设这就是你所说的“阻止它”) – trentcl

+0

@trentcl我明白了。是的,我注意到了大括号,并且意识到在最后一个语句中通常隐含着生锈的返回值,所以我看到'''Ok(environment)=>'''后面有'''environment'''。谢谢! – Joe