2017-09-03 1 views
1

Je veux créer des structures qui ont une propriété d'un type générique T. Ce type générique sera utilisé pour les calculs, donc je veux que T soit toutes sortes de types numériques tels que i32, u32, f32, uf32, i64 etc. Comment puis-je y parvenir?Comment puis-je contraindre T dans Rust à accepter uniquement les types numériques?

+0

Pourquoi ne pas dépendre des caractéristiques dont vous avez besoin en fait, en plus de peut-être le trait 'Copy'? Cela couvrira les nombres et les objets de type numérique conçus à l'avenir (pensez à des nombres complexes ou à des tailles non standard). – user4815162342

Répondre

5

C'est ce que le num-traits crate peut être utilisé. Le Num trait est implémenté pour tous les types numériques.

Cela garantit votre type générique T a tous les opérateurs numériques attendus, Add, Sub, Mul, Div, Rem, peut être partiellement vérifiée par l'égalité PartialEq, il expose également une valeur pour 1 et 0 pour T.

Vous pouvez voir comment la caisse met en œuvre le trait here:

int_trait_impl!(Num for usize u8 u16 u32 u64 isize i8 i16 i32 i64); 
+0

Merci, cela semble prometteur. Cependant, il doit y avoir un moyen dans le langage Rust lui-même pour mettre en œuvre ce droit? En C# par exemple, vous avez le mot-clé where qui contraint les types acceptés. La caisse elle-même doit avoir utilisé une fonctionnalité de langue pour ce faire. – Midas

+1

@Midas Ils ont défini le trait 'Num' et l'ont implémenté pour tous les types numériques standards. Vous pouvez créer votre propre trait 'Num' et l'implémenter pour tous les types numériques, mais vous pouvez aussi bien utiliser la caisse. – Lukazoid

+3

Il suffit de regarder ce que la caisse fait, ils ne font que cuisiner avec de l'eau – the8472