مقایسه

این trait‌ها از مقایسه بین مقادیر پشتیبانی می‌کنند. همه‌ی این trait‌ها را می‌توان برای تایپ‌هایی که شامل فیلدهایی هستند که این trait‌ها را پیاده‌سازی می‌کنند، به‌دست آورد.

PartialEq and Eq

PartialEq یک رابطه هم‌ارزی جزئی است که دارای متد الزامی eq و متد ارائه‌شده ne می‌باشد. عملگرهای == و =! این متدها را فراخوانی می‌کنند.

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

Eq یک رابطه هم‌ارزی کامل است (بازتابی، متقارن، و transitive) و شامل PartialEq می‌شود. توابعی که به هم‌ارزی کامل نیاز دارند، از Eq به‌عنوان یک trait bound استفاده می‌کنند.

PartialOrd and Ord

PartialOrd یک ترتیب جزئی را تعریف می‌کند و دارای متد partial_cmp است. این ویژگی برای پیاده‌سازی عملگرهای <، <=، >= و > استفاده می‌شود.

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 یک ترتیب کامل است که در آن متد cmp مقدار Ordering را برمی‌گرداند.

This slide should take about 5 minutes.

PartialEq می‌تواند بین تایپ‌های مختلف پیاده‌سازی شود، اما Eq نمی‌تواند، زیرا بازتابی است:

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

در عمل، معمولاً این trait‌ها به‌طور خودکار به‌دست می‌آیند، اما کمتر پیش می‌آید که آن‌ها به‌طور دستی پیاده‌سازی شوند.