2017-08-25 2 views
7

Rust a décidé d'interdire les littéraux flottants dans les modèles: Matching on floating-point literal values is totally allowed and shouldn't be #41255. C'est actuellement un avertissement mais sera une erreur difficile dans une prochaine version.Alternatives aux points flottants correspondants

Ma question est alors, comment puis-je obtenir l'équivalent par exemple avec le code suivant ?:

struct Point { 
    x: f64, 
    y: f64, 
} 

let point = Point {x: 5.0, y: 4.0}; 

match point { 
    Point {x: 5.0 , y} => println!("y is {} when x is 5", y), // Causes warning 
    _ => println!("x is not 5") 
} 

est-il maintenant impossible? Ai-je besoin de changer la façon dont je pense aux motifs? Y a-t-il une autre façon de l'assortir?

Répondre

13

Vous pouvez utiliser un garde match:

match point { 
    Point { x, y } if x == 5.0 => println!("y is {} when x is 5", y), 
    _ => println!("x is not 5"), 
} 

Cela met la responsabilité de retour à vous, il ne produit aucune sorte d'avertissement. Je vous conseille donc d'aller plus loin car il peut s'agir d'une source de bugs (ce qui, je suppose, est la raison pour laquelle l'équipe de base de Rust ne veut pas faire de comparaison avec les valeurs à virgule flottante).