我有一个if语句,两个分支都需要返回一个HashMap。但是,在其中一个分支中,我有一个拥有所有权的HashMap,而在另一个分支中,我从某个结构体的引用中访问一个HashMap。目前,我被迫在if块外面定义一个未绑定的let变量来保存第一个分支中的拥有所有权的map(否则它会在if块结束时被释放,并且引用将无效)。
struct Descriptor {
env: HashMap<String, String>
}
fn merge_env(_a: &HashMap<..>, _b: &HashMap<..>) -> HashMap<String, String> {
todo!()
}
fn example(d1: &Descriptor, d2: &Descriptor, feature_on: bool) {
// Can I somehow avoid having to declare this?
let holder;
let env = if feature_on {
holder = merge_env(&d1.env, &d2.env);
&holder
} else {
&d1.env
};
read_env(&env);
}
fn read_env(_env: &HashMap<String, String>) { todo!() }
有没有避免未绑定let
的方法?也许有个可以保存所有权和借用值的包装器(wrapper)?另外,当前的方式是否符合惯用法?
std::borrow::Cow
,但在我看来,变量已经很好了。 - Colonel Thirty Two