Menu
Coddy logo textTech

Eşitlik Trait'leri

Coddy'nin Rust Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 38 / 61.

Rust'ta özel bir yapının (struct) iki örneğini == ile karşılaştırmak varsayılan olarak çalışmaz. Derleyici, iki yapının eşit olup olmadığını nasıl belirleyeceğini bilmez; bunu PartialEq trait'ini uygulayarak ona bildirmeniz gerekir.

Debug ve Copy gibi, PartialEq özelliğini otomatik olarak türetebilirsiniz:

#[derive(PartialEq)]
struct Coordinate {
    x: i32,
    y: i32,
}

let a = Coordinate { x: 5, y: 10 };
let b = Coordinate { x: 5, y: 10 };
let c = Coordinate { x: 3, y: 7 };

println!("{}", a == b);  // true
println!("{}", a == c);  // false

Türetildiğinde, PartialEq yapının (struct) her bir alanını karşılaştırır. İki örnek, yalnızca tüm karşılık gelen alanları eşleştiğinde eşittir.

Ayrıca, tam eşitliği belirten bir işaretçi trait olan Eq ile de karşılaşacaksınız; bu, her değerin kendisine eşit olduğu anlamına gelir. Çoğu tür bunu sağlar, ancak kayan noktalı sayılar sağlamaz (çünkü NaN != NaN). Tam sayı alanlarına sahip struct'lar için her ikisini de güvenle türetebilirsiniz:

#[derive(PartialEq, Eq)]
struct Coordinate {
    x: i32,
    y: i32,
}

Eq kendi metotlarına sahip değildir; sadece türün yansımalı eşitliğe sahip olduğunu belirtir. Bazı standart kütüphane özellikleri PartialEq'e ek olarak Eq gerektirir, bu nedenle uygun türler için her ikisini birlikte türetmek yaygındır.

challenge icon

Görev

Kolay

PartialEq ve Eq trait'lerinin struct örnekleri arasında karşılaştırmayı nasıl mümkün kıldığını gösteren bir renk eşleştirme sistemi kuralım!

Renk karşılaştırma mantığınızı düzenlemek için iki dosya oluşturacaksınız:

  • color.rs: Üç genel (public) alana sahip bir genel Color struct'ı tanımlayın: red, green ve blue (hepsi u8). İki rengin == kullanılarak karşılaştırılabilmesi için hem PartialEq hem de Eq türetin (derive). Türetildiğinde, Rust iki rengi ancak her üç RGB bileşeni de tam olarak eşleşirse eşit kabul edecektir.
  • main.rs: Renk modülünüzü dahil edin ve sağlanan girdileri kullanarak iki Color örneği oluşturun. Bunları == kullanarak karşılaştırın ve eşleşip eşleşmediklerini yazdırın.

Çıktınız iki rengin aynı olup olmadığını belirtmelidir:

Color 1: rgb({r1}, {g1}, {b1})
Color 2: rgb({r2}, {g2}, {b2})
Colors match: {true/false}

Örneğin, 255, 128, 0, 255, 128, 0 girdileriyle:

Color 1: rgb(255, 128, 0)
Color 2: rgb(255, 128, 0)
Colors match: true

Ve 100, 100, 100, 200, 200, 200 girdileriyle:

Color 1: rgb(100, 100, 100)
Color 2: rgb(200, 200, 200)
Colors match: false

Altı girdi alacaksınız: ilk renk için RGB değerleri (üç değer), ardından ikinci renk için RGB değerleri (üç değer). Her birini u8 olarak ayrıştırın (parse).

Kopya kağıdı

Özel struct'ları == kullanarak karşılaştırmak için, PartialEq trait'ini türeterek (derive) uygulayın:

#[derive(PartialEq)]
struct Coordinate {
    x: i32,
    y: i32,
}

let a = Coordinate { x: 5, y: 10 };
let b = Coordinate { x: 5, y: 10 };

println!("{}", a == b);  // true

Türetildiğinde, PartialEq tüm alanları karşılaştırır; iki örnek ancak tüm karşılık gelen alanlar eşleştiğinde eşittir.

Eq trait'i, tam eşitliği (her değerin kendisine eşit olduğunu) belirten bir işaretçi (marker) trait'tir. Kayan noktalı sayılar hariç (çünkü NaN != NaN) çoğu tür bunu sağlar. Tam sayı alanlarına sahip struct'lar için her iki trait'i birlikte türetin:

#[derive(PartialEq, Eq)]
struct Coordinate {
    x: i32,
    y: i32,
}

Eq'in hiçbir metodu yoktur; yansımalı (reflexive) eşitliği belirtir. Bazı standart kütüphane özellikleri, PartialEq'e ek olarak Eq gerektirir.

Kendin dene

mod color;

use color::Color;

fn main() {
    // Altı RGB değerini oku
    let mut input = String::new();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let r1: u8 = input.trim().parse().expect("Invalid input");

    input.clear();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let g1: u8 = input.trim().parse().expect("Invalid input");

    input.clear();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let b1: u8 = input.trim().parse().expect("Invalid input");

    input.clear();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let r2: u8 = input.trim().parse().expect("Invalid input");

    input.clear();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let g2: u8 = input.trim().parse().expect("Invalid input");

    input.clear();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let b2: u8 = input.trim().parse().expect("Invalid input");

    // TODO: Ayrıştırılan değerleri kullanarak iki Color örneği oluşturun

    // TODO: Color 1'i şu formatta yazdırın: Color 1: rgb(r, g, b)

    // TODO: Color 2'yi şu formatta yazdırın: Color 2: rgb(r, g, b)

    // TODO: == kullanarak iki rengi karşılaştırın ve şunu yazdırın: Colors match: {true/false}
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Object Oriented Programming bölümündeki tüm dersler