2016-07-09 10 views
0

Ich habe folgendes Spiel Bedingung, dass die eingegebene Vermutung überprüft, ob eine gültige Zahl ist (es ist vom Rost Spiel Übung zu erraten):Rust Spiel auf Nummer Zustand

let mut guess = String::new(); 
io::stdin().read_line(&mut guess).expect("Failed to read"); 
let guess: u32 = match guess.trim().parse() { 
    Ok(num) => num, 
    Err(_) => continue, 
}; 

Wie erweitere ich das Match zu überprüfen, ob die Zahl ist negativ oder 0 (ich möchte in diesem Fall einen Fehler werfen) und normal weitermachen, wenn die Zahl positiv ist?

Ich habe versucht, ein if auf der num innerhalb der Ok-Fall hinzufügen, aber das wirft einen Fehler (wahrscheinlich, weil num an den Wert von rate gebunden ist) und scheint auch nicht idiomatisch.

Antwort

3

Ein match Arm kann guarded sein:

let guess: u32 = match guess.trim().parse() { 
    Ok(num) if num > 0 => num, 
    Ok(num) => return Err(whatever), 
    Err(_) => continue, 
}; 
+0

ich schnell Zweifel haben. Mein Fall für negativ (der zweite Ok) funktioniert nicht, wenn ich eine negative Zahl übergebe. Ich bekomme stattdessen den Err (_) -Zustand. Liegt das daran, dass das Parse für eine negative Zahl nicht als String funktioniert oder mache ich etwas falsch? – KDN

+0

Aber du analysierst es als 'u32', das kann sowieso nicht negativ sein, so dass du einen Parse-Fehler bekommst. Willst du das nicht? – mcarton

+0

Sie haben Recht, alberne mich, habe die u32 nicht gesehen – KDN