是否可以构建引用环境变量的 &str 哈希图?



我正在尝试制作环境变量的只读映射。

fn os_env_hashmap() -> HashMap<&'static str, &'static str> {
let mut map = HashMap::new();
use std::env;
for (key,val) in env::vars_os() {
let k = key.to_str();
if k.is_none() { continue } 
let v = val.to_str();
if v.is_none() { continue }
k.unwrap();
//map.insert( k.unwrap(), v.unwrap() );
}
return map;
}

似乎无法取消注释底部附近的"插入"行,而不会出现关于键、val、k 和 v 是本地的编译器错误。

也许可以通过使用 String 而不是 str 来修复编译器错误,但 str 似乎非常适合只读结果。

随意建议一种更惯用的方法。

不幸的是,仅使用 Rust 标准库的功能并不简单。

如果env::vars_os()&'static OsStr上返回一个迭代器而不是OsString,这将是微不足道的。遗憾的是,并非所有平台都允许创建对环境变量内容的&OsStr。特别是在Windows上,本机编码是UTF-16,但OsStr所需的编码是WTF-8。出于这个原因,在通过迭代env::vars_os()创建OsString之前,您确实没有可以引用的OsStr

正如问题评论所提到的,最简单的事情是返回拥有String

fn os_env_hashmap() -> HashMap<String, String> {
let mut map = HashMap::new();
use std::env;
for (key, val) in env::vars_os() {
// Use pattern bindings instead of testing .is_some() followed by .unwrap()
if let (Ok(k), Ok(v)) = (key.into_string(), val.into_string()) {
map.insert(k, v);
}
}
return map;
}

结果不是"只读"的,但它不是共享的,因此您不能通过更改它来引起数据竞争或其他奇怪的错误。

参见

  • 有没有办法返回对函数中创建的变量的引用?
  • 将本地字符串作为切片 (&str( 返回

最新更新