2016-06-21 57 views
1

我遍歷了一個HashMap並通過模式匹配在一些本地變量中的值。爲什麼迭代HashMap <&str,&str>會產生一個&& str?

Delegater

fn lyrics_no_bottles(song_template:&mut String){ 
    let mut template_partials = HashMap::new(); 

    template_partials.insert("start", "No more bottles"); 
    template_partials.insert("repeat", "no more bottles"); 
    template_partials.insert("remaining", "99 bottles"); 
    template_partials.insert("message", "Go to the store and buy some more"); 

    resolve_template(song_template, template_partials); 
} 

fn resolve_template(song_template:&mut String, partials: HashMap<&str, &str>){ 
    let start:&str; 
    let repeat:&str; 
    let remaining:&str; 
    let message:&str; 

    for key in partials.keys(){ 
     match key { 
      "start" => start = partials.get(key), 
      "repeat" => repeat = partials.get(key), 
      "remaining" => remaining = partials.get(key), 
      "message" => message = partials.get(key) 
     } 
    } 

    *song_template = song_template.replace("%1", start); 
    *song_template = song_template.replace("%2", repeat); 
    *song_template = song_template.replace("%3", message); 
    *song_template = song_template.replace("%4", remaining); 
} 

錯誤輸出

lib.rs:51:5: 58:6 error: type mismatch resolving `<std::collections::hash::map::Keys<'_, &str, &str> as core::iter::Iterator>::Item == &str`: 
expected &-ptr, 
    found str [E0271] 
lib.rs:51  for key in partials.keys(){ 
lib.rs:52   match key { 
lib.rs:53    "start" => start = partials.get(key), 
lib.rs:54    "repeat" => repeat = partials.get(key), 
lib.rs:55    "remaining" => remaining = partials.get(key), 
lib.rs:56    "message" => message = partials.get(key) 
      ... 
lib.rs:51:5: 58:6 help: run `rustc --explain E0271` to see a detailed explanation 
lib.rs:53:32: 53:49 error: mismatched types: 
expected `&str`, 
    found `core::option::Option<&&str>` 
(expected &-ptr, 
    found enum `core::option::Option`) [E0308] 
lib.rs:53    "start" => start = partials.get(key), 

我不underst以及爲什麼當我聲明參數爲HashMap<&str,&str>時編譯器認爲有&&str

回答

3

因爲that particular method returns a reference wrapped by an Option

基本上,如果您在那裏存儲String並使用get ..您將通過致電get獲得Option<&String>。作爲致電get的結果,存儲&str將返回Option<&&str>。價值觀以及如何

例子,當你調用get他們會出現:當你將它插入值

String -> Option<&String> 
&str -> Option<&&str> 
u32 -> Option<&u32> 

&str的所有權被轉移到HashMap中。因此,HashMap使用get ...或mutable references using get_mut爲您返回對它們的引用。

操場正在損壞(無法分享任何東西)......所以這裏工作..打破你的代碼樣本:

use std::collections::HashMap; 

fn main() { 
    let mut map: HashMap<&str, &str> = HashMap::new(); 
    map.insert("start", "value"); 

    let mut start: &str = "Unknown"; 
    let mut repeat: &str; 
    let mut remaining: &str; 
    let mut message: &str; 

    for key in map.keys() { 
     match &key[..] { 
      "start" => start = map.get(key).unwrap(), 
      "repeat" => repeat = map.get(key).unwrap(), 
      "remaining" => remaining = map.get(key).unwrap(), 
      "message" => message = map.get(key).unwrap(), 
      _ => unreachable!() 
     } 
    } 

    println!("Result: {}", start); 
} 
+0

所以我也有破壞了'選項<&&str>'之前我甚至可以deref'&& str' ...我會嘗試'如果讓一些(x)' – xetra11

+0

正確。也許我應該在你的答案中給你一個解決實際問題的方法。我現在補充一下。 –

+0

謝謝......如果再讓我們繼續使用 – xetra11

相關問題