Eu tenho um enum:
enum Operation {
Add,
Subtract,
}
impl Operation {
fn from(s: &str) -> Result<Self, &str> {
match s {
"+" => Ok(Self::Add),
"-" => Ok(Self::Subtract),
_ => Err("Invalid operation"),
}
}
}
Desejo garantir, em tempo de compilação, que todas as variantes de enumeração sejam tratadas na from
função.
Por que eu preciso disso? Por exemplo, eu posso adicionar uma Product
operação e esquecer de lidar com este caso na from
função:
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"),
}
}
}
É possível garantir que a expressão de correspondência retorne todas as variantes de um enum? Caso contrário, qual é a melhor maneira de imitar esse comportamento?
Embora exista uma maneira complicada - e frágil - de inspecionar seu código com macros procedurais, um caminho muito melhor é usar testes. Os testes são mais robustos, muito mais rápidos de escrever e verificarão as circunstâncias nas quais cada variante é retornada, não apenas que ela aparece em algum lugar.
Se você estiver preocupado com a possibilidade de os testes continuarem após adicionar novas variantes à enumeração, use uma macro para garantir que todos os casos sejam testados:
fonte