2017-08-25 17 views
7

Rust đã quyết định không cho phép các chữ nổi trong các mẫu: Matching on floating-point literal values is totally allowed and shouldn't be #41255. Nó hiện là một cảnh báo nhưng sẽ là một lỗi nghiêm trọng trong một bản phát hành trong tương lai.Các giải pháp thay thế cho các điểm nổi phù hợp

Câu hỏi của tôi là sau đó, làm thế nào để đạt được tương đương ví dụ với đoạn mã sau ?:

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

là nó bây giờ không thể? Tôi có cần thay đổi cách suy nghĩ về các mẫu không? Có cách nào khác phù hợp với nó không?

Trả lời

13

Bạn có thể sử dụng một người bảo vệ trận đấu:

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

này đặt trách nhiệm lại cho bạn, vì vậy nó không tạo ra bất kỳ loại cảnh báo.

Floating point equality is an interesting subject though ... vì vậy tôi khuyên bạn nên xem xét kỹ hơn vì nó có thể là một nguồn lỗi (mà tôi tưởng tượng là lý do nhóm lõi Rust không muốn khớp với giá trị dấu phẩy động).

Các vấn đề liên quan