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.
Görev
KolayPartialEq 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 genelColorstruct'ı tanımlayın:red,greenveblue(hepsiu8). İki rengin==kullanılarak karşılaştırılabilmesi için hemPartialEqhem deEqtü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 ikiColorö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: trueVe 100, 100, 100, 200, 200, 200 girdileriyle:
Color 1: rgb(100, 100, 100)
Color 2: rgb(200, 200, 200)
Colors match: falseAltı 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}
}
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
1Metotlar ve Davranış
Uygulama Bloklarına GirişSelf ParametresiDeğiştirilebilir Metotlarİlişkili FonksiyonlarBirden Fazla Uygulama BloğuMetot ZincirlemeÖzet - Dikdörtgen Eylemleri4Proje: Sanal Evcil Hayvan
Evcil Hayvanı TanımlamaEvcil Hayvanı Besleme7Standart Trait'ler
Debug Trait'iDisplay Trait'iClone ve CopyEşitlik Trait'leriÖzet - Yazdırılabilir Nokta2Kapsülleme ve Modüller
Modül TemelleriPublic Anahtar KelimesiPrivate AlanlarGetter'larSetter'larÖzet - Güvenli Kasa5Generic Yapılar
Generic Struct'larGeneric MetotlarÇoklu Generic TürlerGeneric FonksiyonlarÖzet - Koordinat Noktası8Sınırlandırıcı Olarak Trait'ler
Trait Sınırlandırıcı SözdizimiÇoklu SınırlandırıcılarWhere CümleciğiTrait'ler ile Tip DöndürmeÖzet - Generic Yazıcı11Rust'ta Tasarım Kalıpları
Newtype KalıbıKompozisyonDrop Trait'iFrom ve IntoÖzet - Smart Pointer Mock3İleri Seviye Enum'lar
Veri İçeren Enum'larEnum MetotlarıVeri Varyantlarını EşlemeOption Enum'ına Yeniden BakışÖzet - Shape Enum6Trait Tanımlama
Trait Nedir?Traitleri UygulamaVarsayılan UygulamalarVarsayılanları Geçersiz KılmaParametreli TraitlerÖzet - Media Player