2014-09-13 6 views
5

Betrachten Sie das folgende BeispielFehler im Muster „Typ dieser Wert muss in diesem Zusammenhang bekannt sein“ matching

fn main() { 
    f("hello", true); 
} 

fn f(str: &str, sen: bool) { 
    let s: &str = match sen { 
     false => str, 
     true => str.chars().map(|x| x.to_lowercase()).collect().as_slice() 
    }; 
    println!("{}", s); 
} 

Ich erhalte diesen Fehler

error: the type of this value must be known in this conntext                                        
true => str.chars().map(|x| x.to_lowercase()).collect().as_slice() 
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

ich ein wenig verwirrt bin, weiß der Compiler nicht, dass der Typ str&str aus der Funktionsdefinition ist? Was fehlt mir hier?

Antwort

4

Der Fehlerort ist möglicherweise verwirrend, das Problem hier ist die collect Methode. Es ist generisch für alle FromIterator und in diesem Fall der Compiler Katze den Typ (was Compiler sieht ist, dass Sie einige Typ X implementieren FromIterator, die eine as_slice Methode produziert eine & str) hat.

Das zweite Problem mit diesem Code, dass Sie versuchen, einen Verweis auf einen lokalen Wert (Ergebnis der Erfassung) aus der Übereinstimmungsangabe zurückzugeben. Sie können das nicht tun, da dieser Wert die Lebensdauer dieses Blocks hat und nach der Zuordnung aufgehoben wird, so dass der zurückgegebene Wert ungültig wäre.

Eine Arbeitslösung (aber es erfordert & str String Umwandlung):

fn main() { 
    f("hello", true); 
} 

fn f(str: &str, sen: bool) { 
    let s: String = match sen { 
     false => str.to_string(), 
     true => str.chars().map(|x| x.to_lowercase()).collect() 
    }; 
    println!("{}", s); 
} 

Ich weiß nicht, was Sie versuchen, am Ende zu erreichen, aber einen Blick auf MaybeOwned nehmen, wenn dies eine sein wird, Funktion, die eine Scheibe (&str) oder eine String zurückgibt.

+0

Danke. Ich habe am Ende temporäre Variablen verwendet, um die 'String' zu speichern und s an' temp_var.as_slice() 'zu binden. Nicht sicher, ob es einen besseren Weg gibt. –

Verwandte Themen