2017-08-25 3 views
7

ルストは、浮動小数点リテラルをパターンで受け入れないことを決定しました:Matching on floating-point literal values is totally allowed and shouldn't be #41255。現在のところ警告ですが、将来のリリースではハードエラーになります。対応する浮動小数点の代替手段

私の質問はどのように私は次のコードは?:

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") 
} 

で例えば同等を達成しない、そしてあるが、それは今では不可能ですか?私はパターンについての考え方を変える必要がありますか?それにマッチする別の方法がありますか?

答えて

13

あなたは試合ガードを使用することができます。

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

これはあなたに戻って上の責任を置くので、それは警告の任意の並べ替えを生成しません。

Floating point equality is an interesting subject though ...だから、それはバグの原因になるかもしれないので、私はそれをさらに調べることをお勧めします(これはRustコアチームが浮動小数点値と一致させたくない理由です)。