Hỗ trợ so sánh

Kiểu dữ liệu implement các trait này có thể được so sánh với nhau. Tất cả các trait này có thể được derive nếu các trường của kiểu dữ liệu sử dụng derive cũng implement các trait này.

PartialEqEq

PartialEq là một quan hệ tương đương một phần. Kiểu dữ liệu implement trait này phải định nghĩa hàm eq, hàm ne tự được định nghĩa dựa trên eq. Các toán tử ==!= sẽ gọi đến các hàm này.

struct Key {
    id: u32,
    metadata: Option<String>,
}
impl PartialEq for Key {
    fn eq(&self, other: &Self) -> bool {
        self.id == other.id
    }
}

Eq là một quan hệ tương đương toàn phần (tính phản xạ, đối xứng và bắc cầu). Kiểu dữ liệu implement trait này mặc định implement PartialEq. Các hàm yêu cầu quan hệ tương đương toàn phần sẽ sử dụng Eq dưới dạng một trait bound.

PartialOrdOrd

PartialOrd định nghĩa một quan hệ thứ tự một phần, với hàm partial_cmp. Trait này được sử dụng để implement các toán tử <, <=, >=, và >.

use std::cmp::Ordering;
#[derive(Eq, PartialEq)]
struct Citation {
    author: String,
    year: u32,
}
impl PartialOrd for Citation {
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
        match self.author.partial_cmp(&other.author) {
            Some(Ordering::Equal) => self.year.partial_cmp(&other.year),
            author_ord => author_ord,
        }
    }
}

Ord là một quan hệ thứ tự toàn phần, với hàm cmp trả về kiểu dữ liệu Ordering.

This slide should take about 10 minutes.

PartialEq có thể được implement để so sánh giữa các kiểu dữ liệu khác nhau, nhưng Eq thì không, vì Eq có tính phản xạ:

struct Key {
    id: u32,
    metadata: Option<String>,
}
impl PartialEq<u32> for Key {
    fn eq(&self, other: &u32) -> bool {
        self.id == *other
    }
}

Trong thực tế, các trait này thường thường được derive, ít khi được implement.