use std::collections::btree_map::BTreeMap;
fn main() {
let mut map: BTreeMap<String, String>;
map.insert("name".to_string(), "aho".to_string());
let name: String = map.get("name");
println!("welcom, {}", name);
}
cargo build
:
src/main.rs:5:24: 5:39 error: mismatched types:
expected `collections::string::String`,
found `core::option::Option<&collections::string::String>`
(expected struct `collections::string::String`,
found enum `core::option::Option`) [E0308]
src/main.rs:5 let name: String = map.get("name");
^~~~~~~~~~~~~~~
src/main.rs:5:24: 5:39 help: run `rustc --explain E0308` to see a detailed explanation
error: aborting due to previous error
Could not compile `hello_world`.
答案 0 :(得分:1)
get()
函数返回Option
类型,其中引用了与该键对应的值。所以你在堆上存储了一个String
,这个函数根据键返回对String
的引用。
我让你的例子缩短了一点。你有一个未初始化的BTreeMap
,所以我先将其初始化 - let mut map: BTreeMap<String, String> = BTreeMap::new();
。在您的情况下,您可以轻松使用if let
语句。
use std::collections::BTreeMap;
fn main() {
let mut map: BTreeMap<String, String> = BTreeMap::new();
map.insert("name".into(), "aho".into());
if let Some(name) = map.get("name") {
println!("welcome, {}", name);
} else {
println!("welcome, stranger");
}
}
但是,如果您确实要返回String
值,则必须首先提取Some(name)
类型的Option
部分,然后使用clone()
函数进行克隆。由于BTreeMap
拥有此String
值,因此您无法在不克隆的情况下将其移出。 clone()
复制原始值。
use std::collections::BTreeMap;
fn main() {
let mut map: BTreeMap<String, String> = BTreeMap::new();
map.insert("name".into(), "aho".into());
if let Some(name) = map.get("name") {
let name: String = name.clone();
println!("welcome, {}", name);
} else {
println!("welcome, stranger");
}
}