我可以从不可变的 BTreeMap 中获取值吗?

Can I get a value from an immutable BTreeMap?

下面的两个代码块本来是等价的,但出于某种原因,我在第二个代码块上遇到了编译器错误。

我很难理解为什么 names 在一个版本中被借用,而在另一个版本中被借用。

我试图弄清楚如何从不可变的 BTreeMap 中读取数据,但似乎没有明确的方法。

工作正常:

let region_name: Option<String> = match subdivision.to_owned() {
    Some(division) => match division.names.unwrap().get("en") {
        Some(name) => Some(name.to_string()),
        _ => None,
    },
    _ => None,
};

不编译:

let region_name: Option<String> = subdivision
    .to_owned()
    .and_then(|division|division.names)
    .and_then(|names| names.get("en"))
    .and_then(|name| Some(name.to_string()));

编译器消息:

error[E0515]: cannot return value referencing function parameter `names`
  --> src/lib.rs:82:27
   |
82 |         .and_then(|names| names.get("en"))
   |                           -----^^^^^^^^^^
   |                           |
   |                           returns a value referencing data owned by the current function
   |                           `names` is borrowed here

subdivision 如下:

#[derive(Deserialize, Serialize, Clone, Debug)]
pub struct Subdivision<'a> {
    pub geoname_id: Option<u32>,
    pub iso_code: Option<&'a str>,
    pub names: Option<BTreeMap<&'a str, &'a str>>,
}
.and_then(|names| names.get("en"))

names 被丢弃在函数(或闭包)的末尾,但您正在尝试 return names.get("en"),它引用了 [=12= 中的值] (Option<&&str>).

.and_then(|data| data.get("en").map(|s| s.to_string()))

此代码可能有效。