Ich habe eine Aufzählung:
enum Operation {
Add,
Subtract,
}
impl Operation {
fn from(s: &str) -> Result<Self, &str> {
match s {
"+" => Ok(Self::Add),
"-" => Ok(Self::Subtract),
_ => Err("Invalid operation"),
}
}
}
Ich möchte beim Kompilieren sicherstellen, dass jede Enum-Variante in der from
Funktion behandelt wird.
Warum brauche ich das? Zum Beispiel könnte ich eine Product
Operation hinzufügen und vergessen, diesen Fall in der from
Funktion zu behandeln:
enum Operation {
// ...
Product,
}
impl Operation {
fn from(s: &str) -> Result<Self, &str> {
// No changes, I forgot to add a match arm for `Product`.
match s {
"+" => Ok(Self::Add),
"-" => Ok(Self::Subtract),
_ => Err("Invalid operation"),
}
}
}
Kann garantiert werden, dass der Übereinstimmungsausdruck jede Variante einer Aufzählung zurückgibt? Wenn nicht, wie kann dieses Verhalten am besten nachgeahmt werden?
Während es sicherlich eine komplizierte und fragile Möglichkeit gibt, Ihren Code mit prozeduralen Makros zu überprüfen, besteht ein viel besserer Weg darin, Tests zu verwenden. Tests sind robuster, viel schneller zu schreiben und überprüfen die Umstände, unter denen jede Variante zurückgegeben wird, und nicht nur, dass sie irgendwo erscheint.
Wenn Sie befürchten, dass die Tests nach dem Hinzufügen neuer Varianten zur Aufzählung weiterhin bestanden werden, können Sie mithilfe eines Makros sicherstellen, dass alle Fälle getestet werden:
quelle