如何使Rust BTreeMap :: get返回一个String?

时间:2016-03-27 05:11:53

标签: rust

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`.

1 个答案:

答案 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");
    }
}