Eşitlik Trait'leri
Coddy'nin Rust Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 38 / 61.
Rust'ta özel bir struct'ın iki örneğini == ile karşılaştırmak varsayılan olarak çalışmaz. Derleyici, iki struct'ın eşit olup olmadığını nasıl belirleyeceğini bilmez. PartialEq trait'ini uygulayarak bunu derleyiciye bildirmen gerekir.
Debug ve Copy gibi, PartialEq'i 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 her alanını karşılaştırır. İki örnek yalnızca karşılık gelen tüm alanları eşleşiyorsa eşittir.
Ayrıca, tam eşitliği belirten bir işaretleyici trait olan Eq ile de karşılaşacaksın; bu, her değerin kendisine eşit olduğu anlamına gelir. Çoğu tür bunu karşılar, ancak kayan noktalı sayılar karşılamaz (çünkü NaN != NaN). Tamsayı alanlara sahip yapılar için her ikisini de güvenle türetebilirsin:
#[derive(PartialEq, Eq)]
struct Coordinate {
x: i32,
y: i32,
}
Eq kendi yöntemlerine sahip değildir. Yalnızca türün yansıyıcı eşitliğe sahip olduğunu belirtir. Bazı standart kütüphane özellikleri, PartialEq’ye ek olarak Eq gerektirir; bu nedenle, uygun türler için her ikisini birlikte türetmek yaygındır.
Görev
KolayYapı örnekleri arasındaki karşılaştırmayı PartialEq ve Eq trait'lerinin nasıl etkinleştirdiğini gösteren bir renk eşleştirme sistemi oluşturalım!
Renk karşılaştırma mantığınızı düzenlemek için iki dosya oluşturacaksınız:
color.rs: Üç herkese açık alana sahip herkese açık birColoryapısı tanımlayın:red,greenveblue(tümüu8). İki renginPartialEqkullanılarak karşılaştırılabilmesi için hemEqhem de==türetin. Türetildiğinde Rust, yalnızca üç RGB bileşeninin tamamı tam olarak eşleşiyorsa iki rengi eşit kabul eder.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, girdiler 255, 128, 0, 255, 128, 0 olduğunda:
Color 1: rgb(255, 128, 0)
Color 2: rgb(255, 128, 0)
Colors match: trueGirdiler 100, 100, 100, 200, 200, 200 olduğunda ise:
Color 1: rgb(100, 100, 100)
Color 2: rgb(200, 200, 200)
Colors match: falseAltı girdi alacaksınız: ilk rengin RGB değerleri (üç değer), ardından ikinci rengin RGB değerleri (üç değer). Her birini u8 olarak ayrıştırın.
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ılmış değerleri kullanarak iki Color örneği oluştur
// TODO: Color 1'i şu formatta yazdır: Color 1: rgb(r, g, b)
// TODO: Color 2'yi şu formatta yazdır: Color 2: rgb(r, g, b)
// TODO: Compare the two colors using == and print: Colors match: {true/false}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama 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 PlayerKendi başına pratik yap: Online Rust derleyicisi