我可以从不变的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,},};

不编译:

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放在函数(或闭包)末尾,但是您尝试返回names.get("en"),该引用引用了names中的值(Option )。

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

此代码可能有效。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...