Karşılaştırmalar

Bu özellikler (traits), değerler arasında karşılaştırmaları destekler. Tüm özellikler, bu özellikleri gerçekleştiren (implement) alanlar içeren türler için türetilebilir.

PartialEq ve Eq

PartialEq, gerekli metot eq ve sağlanan metot ne ile kısmi bir denklik ilişkisidir. == ve != operatörleri bu metotları çağırır.

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

Eq tam bir denklik ilişkisidir (yansımalı, simetrik ve geçişme) (reflexive, symmetric, and transitive) ve PartialEq özelliğini kapsar (imply). Tam denklik gerektiren fonksiyonlar, bir özellik sınırı (trait bound) olarak Eq kullanır.

PartialOrd ve Ord

PartialOrd, partial_cmp metoduyla kısmi bir sıralama tanımlar. <, <=, >= ve > operatörlerini gerçekleştirmek (implement) için kullanılır.

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’nin Ordering geri döndürdüğü tam bir sıralamadır.

This slide should take about 5 minutes.
  • PartialEq farklı türler arasında gerçekleştirilebilir (implement), ancak Eq yansımalı (reflexive) olduğu için gerçekleştirilemez:

    struct Key {
        id: u32,
        metadata: Option<String>,
    }
    impl PartialEq<u32> for Key {
        fn eq(&self, other: &u32) -> bool {
            self.id == *other
        }
    }
  • Pratikte bu özellikleri (traits) türetmek (derive) yaygındır, ancak onları gerçekleştirmek (implement) yaygın değildir.

  • Rust’ta referansları karşılaştırırken, gösterdikleri şeylerin değerini karşılaştırır, referansların kendilerini DEĞİL. Bu, gösterilen değerler aynıysa, iki farklı şeye yapılan referansların eşit olarak karşılaştırılabileceği anlamına gelir:

    fn main() {
        let a = "Merhaba";
        let b = String::from("Merhaba");
        assert_eq!(a, b);
    }