Mệnh đề where

Một bound (ràng buộc) cũng có thể được định nghĩa bằng cách sử dụng mệnh đề where ngay trước dấu {, thay vì phải định nghĩa tại ngay lần đề cập đầu tiên của một kiểu. Ngoài ra, các mệnh đề where có thể áp dụng bound cho các kiểu tuỳ ý, chứ không chỉ riêng cho các tham số kiểu (type parameters).

Việc sử dụng mệnh đề where sẽ hữu dụng khi rơi vào những trường hợp sau:

  • Khi chỉ định rõ các kiểu dữ liệu generic và bound của chúng một cách riêng biệt.
impl <A: TraitB + TraitC, D: TraitE + TraitF> MyTrait<A, D> for YourType {}
// Biểu thị bounds bằng mệnh đề `where`
impl <A, D> MyTrait<A, D> for YourType where
    A: TraitB + TraitC,
    D: TraitE + TraitF {}
  • Khi mà việc sử dụng mệnh đề where sẽ trực quan dễ đọc hơn việc sử dụng cú pháp thông thường:

Phần impl trong ví dụ dưới đây sẽ không thể được biểu thị trực tiếp nếu không dùng mệnh đề where

use std::fmt::Debug;
trait PrintInOption {
    fn print_in_option(self);
}
// Ở đoạn này, nếu không dùng `where`, ta sẽ phải khai báo như sau `T: Debug` hoặc là
// dùng một cách gián tiếp khác để khai báo, do đó ta sử dụng mệnh đề `where` để dễ đọc hơn:
impl<T> PrintInOption for T where
    Option<T>: Debug {
    // Chúng ta muốn `Option<T>: Debug` sẽ là bound ở đây bởi vì đó là thứ sẽ được in ra.
    // Nếu sử dụng cách khác sẽ dẫn đến việc sử dụng một bound không đúng.
    fn print_in_option(self) {
        println!("{:?}", Some(self));
    }
}
fn main() {
    let vec = vec![1, 2, 3];
    vec.print_in_option();
}

Đọc thêm:

RFC, struct, và trait