2017-04-16 4 views
1

Rust beklagt sich, dass get_string nicht lange genug lebt. Es scheint für den gesamten Funktionsumfang am Leben zu bleiben, aber ich kann nicht sehen, wie das passiert.Wert will für den gesamten Funktionsumfang leben

error: `get_string` does not live long enough 
    --> src\lib.rs:7:23 
    | 
7 |  for value_pair in get_string.split('&') { 
    |      ^^^^^^^^^^ does not live long enough 
... 
19 | } 
    | - borrowed value only lives until here 
    | 
note: borrowed value must be valid for the anonymous lifetime #1 defined on the body at 3:59... 
    --> src\lib.rs:3:60 
    | 
3 | fn parse_get(get_string: &str) -> HashMap<&str, Vec<&str>> { 
    |               ^

use std::collections::HashMap; 

fn parse_get(get_string: &str) -> HashMap<&str, Vec<&str>> { 
    let get_string = String::from(get_string); 
    let mut parameters: HashMap<&str, Vec<&str>> = HashMap::new(); 

    for value_pair in get_string.split('&') { 
     let name = value_pair.split('=').nth(0).unwrap(); 
     let value = value_pair.split('=').nth(1).unwrap(); 

     if parameters.contains_key(name) { 
      parameters.get_mut(name).unwrap().push(value); 
     } else { 
      parameters.insert(name, vec![value]); 
     } 
    } 

    parameters 
} 
+2

Sie versuchen, Referenzen auf eine lokale Variable zurückzugeben; die lokale Variable lebt nicht lange genug, um einen Verweis auf _because_ es ist lokal ... – ildjarn

+1

Grundsätzlich ein Duplikat von [gibt es eine Möglichkeit, einen Verweis auf eine Variable in einer Funktion erstellt zurückgeben?] (http://stackoverflow.com/q/32682876/155423) – Shepmaster

Antwort

4

Sie kopieren den Eingang &str hier:

let get_string = String::from(get_string); 

Diese Kopie von der Funktion ist im Besitz und wird fallen gelassen werden, wenn die Funktion beendet, aber Sie kehren auch eine HashMap, die Verweise darauf enthält. Es sollte klar sein, warum das nicht funktioniert.

Durch das Entfernen dieser Zeile wird der Fehler behoben, weil Sie stattdessen auf das Argument der Funktion verweisen.

+0

Ich erkannte nicht, dass std :: slice implementiert wurde. Es funktioniert gut nach dem Entfernen dieser Zeile. –

Verwandte Themen