Trait Kesetaraan
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Rust di Coddy. Pelajaran 38 dari 61.
Membandingkan dua instance struct kustom dengan == tidak berfungsi secara bawaan di Rust. Compiler tidak tahu cara menentukan apakah dua struct sama. Kamu perlu memberi tahu compiler dengan mengimplementasikan trait PartialEq.
Seperti Debug dan Copy, kamu bisa memperoleh PartialEq secara otomatis:
#[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
Saat diturunkan, PartialEq membandingkan setiap field pada struct. Dua instance sama hanya jika semua field yang bersesuaian cocok.
Kamu juga akan menemukan Eq, yaitu trait penanda yang menunjukkan kesetaraan total, artinya setiap nilai sama dengan dirinya sendiri. Sebagian besar tipe memenuhi sifat ini, tetapi angka titik mengambang tidak, karena NaN != NaN. Untuk struct dengan field bilangan bulat, kamu dapat menurunkan keduanya dengan aman:
#[derive(PartialEq, Eq)]
struct Coordinate {
x: i32,
y: i32,
}
Eq tidak memiliki method sendiri. Eq hanya menandakan bahwa tipe tersebut memiliki kesetaraan refleksif. Beberapa fitur standard library memerlukan Eq selain PartialEq, jadi biasanya keduanya diturunkan sekaligus untuk tipe yang memenuhi syarat.
Tantangan
MudahMari buat sistem pencocokan warna yang menunjukkan cara trait PartialEq dan Eq memungkinkan perbandingan antar-instance struct!
Kamu akan membuat dua file untuk mengatur logika perbandingan warnamu:
color.rs: Definisikan structColorpublik dengan tiga field publik:red,green, danblue(semuanya bertipeu8). DerivePartialEqdanEqagar dua warna bisa dibandingkan menggunakan==. Saat di-derive, Rust akan menganggap dua warna sama hanya jika ketiga komponen RGB cocok persis.main.rs: Sertakan module warna dan buat dua instanceColormenggunakan input yang diberikan. Bandingkan keduanya menggunakan==dan cetak apakah warnanya cocok atau tidak.
Output-mu harus menunjukkan apakah kedua warna sama:
Color 1: rgb({r1}, {g1}, {b1})
Color 2: rgb({r2}, {g2}, {b2})
Colors match: {true/false}Contohnya, dengan input 255, 128, 0, 255, 128, 0:
Color 1: rgb(255, 128, 0)
Color 2: rgb(255, 128, 0)
Colors match: trueDan dengan input 100, 100, 100, 200, 200, 200:
Color 1: rgb(100, 100, 100)
Color 2: rgb(200, 200, 200)
Colors match: falseKamu akan menerima enam input: nilai RGB untuk warna pertama (tiga nilai), diikuti nilai RGB untuk warna kedua (tiga nilai). Parse setiap nilai sebagai u8.
Coba sendiri
mod color;
use color::Color;
fn main() {
// Baca enam nilai RGB
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: Buat dua instance Color menggunakan nilai yang sudah diuraikan
// TODO: Cetak Color 1 dengan format: Color 1: rgb(r, g, b)
// TODO: Cetak Color 2 dengan format: Color 2: rgb(r, g, b)
// TODO: Bandingkan kedua warna menggunakan == dan cetak: Colors match: {true/false}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Method dan Perilaku
Pengantar Blok ImplementasiParameter SelfMethod MutableFungsi TerkaitBeberapa Blok ImplementasiMethod BerantaiRangkuman: Aksi Persegi Panjang4Proyek: Hewan Peliharaan Virtual
Mendefinisikan Hewan PeliharaanMemberi Makan Hewan Peliharaan7Trait Standar
Trait DebugTrait DisplayClone dan CopyTrait KesetaraanRingkasan: Titik yang Dapat Dicetak2Enkapsulasi dan module
Dasar-Dasar moduleKata Kunci publicField privateGetterSetterRekap: Loker AmanLatihan sendiri: Compiler Rust online