Comment faire correspondre les valeurs enum avec un entier?
Je peux obtenir une valeur entière d'un énumérations comme ceci:
enum MyEnum {
A = 1,
B,
C,
}
let x = MyEnum::C as i32;
mais je n'arrive pas à le faire:
match x {
MyEnum::A => {}
MyEnum::B => {}
MyEnum::C => {}
_ => {}
}
Comment puis-je correspondre à l'encontre des valeurs de l'enum ou d'essayer de convertir les x
retour à un MyEnum
?
Je peux voir une fonction comme ceci étant utile pour les énumérations, mais il n'existe pas:
impl MyEnum {
fn from<T>(val: &T) -> Option<MyEnum>;
}
source d'informationauteur dhardy
Vous devez vous connecter pour publier un commentaire.
std::nombre::FromPrimitive
est marqué comme instable et ne sera pas inclus dans la Rouille 1.0. Comme solution de contournement, j'ai écrit leenum_primitive
caissequi exporte une macroenum_from_primitive!
qui encapsule uneenum
déclaration et l'ajoute automatiquement à une mise en œuvre denum::FromPrimitive
(à partir de lanum
caisse). Exemple:Vous pouvez prendre avantage de correspondre à des gardes à écrire un équivalent, mais moins agiles, construction:
std::mem::transmute
peut également être utilisé:Mais cela nécessite que vous connaissez la taille de l'enum, de sorte que vous pouvez lancer à un scalaire premier, et va également produire un comportement indéfini si
x
n'est pas une valeur valide pour l'enum.Vous pouvez dériver
FromPrimitive
:Si vous êtes sûr que les valeurs de l'entier sont inclus dans l'enum, vous pouvez utiliser
std::mem::transmuter
.Cela doit être utilisé avec
#[repr(..)]
pour contrôler le type sous-jacent.Exemple Complet:
Noter que, contrairement à certains des autres réponses, cela nécessite seulement de la Rouille de la bibliothèque standard.
Si l'entier vous correspondant est basé sur la ordre des variantes de l'enum, vous pouvez utiliser gratter pour générer un itérateur de la enums et prendre le bon: