如何解决我可以从不变的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()))
此代码可能有效。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。