2015-07-16 10 views
7

Mi chiedo con la migliore pratica di gestire il risultato None nell'ottenere valori da un HashMap. Dato che ho una semplice funzione:Come posso restituire qualcosa dal caso Nessuno di HashMap.get?

pub fn get_value(&self, value: String) -> &String { 

Si potrebbe ottenere il valore dal HashMap con unwrap:

my_map.get(&"hello".to_string()).unwrap() 

Ma io non voglio che panico se ottiene None. Cos'altro posso fare?

match self.os_config.get(&value) { 
    Some(val) => return &val, 
    None => //?? cannot return a String::new().. as it is temporal? 
} 

risposta

14

Per cominciare, &String è un tipo che non dovrebbe mai esistere in una firma; dovresti prendere il più generale &str. String è specificamente una stringa di proprietà, mentre &str è una sezione di stringa. Poiché gli strumenti StringDeref<Target = str>, &String sono convertiti in &str.

Quando si tratta di chiavi hash mappa, si dovrebbe anche prendere &str piuttosto che &String, e si dovrebbe evitare di prendere String se tutto ciò che serve è &str; non è necessario consumare la stringa. È possibile indicizzare uno HashMap<String, _> con &str bene.

Il tipo di stringa letterale è &'static str; &'static str sarà abbastanza felicemente costringere a &'a str per qualsiasi 'a, quindi è possibile utilizzare tranquillamente una stringa letterale vuota sul ramo None. Ecco il risultato:

pub fn get_value(&self, value: &str) -> &str { 
    match self.os_config.get(value) { 
     Some(val) => val, 
     None => "", 
    } 
} 

Questo può anche essere scritta utilizzando il pratico unwrap_or metodo:

Per questo motivo, la restituzione di un Option<&str> non è forse così noioso; altri posti possono aggiungere .unwrap_or("") se lo desiderano. Naturalmente, tutto dipende dalla semantica desiderata.

2

Se è necessario restituire un tipo o un risultato arbitrario, in modo da non poter utilizzare un riferimento 'static, è possibile restituire un tipo Cow dalla funzione.

Una semplice demo è Holy std::borrow::Cow!, ma in pratica è sufficiente racchiuderla in un Cow::Borrowed normalmente e un Cow::Owned per il caso di errore.

+0

Holy Cow, sono stato citato qui. ;-) Sentitevi liberi di copiare l'esempio qui. Cercherò di assicurarmi che il collegamento non vada esaurito, ma non si sa mai. – llogiq

Problemi correlati