Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 struct Color publik dengan tiga field publik: red, green, dan blue (semuanya bertipe u8). Derive PartialEq dan Eq agar 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 instance Color menggunakan 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: true

Dan dengan input 100, 100, 100, 200, 200, 200:

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

Kamu 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}
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Rust online