Menu
CoddyTech

Trait Drop

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Rust di Coddy. Pelajaran 56 dari 61.

Saat sebuah nilai keluar dari cakupan di Rust, nilai itu otomatis dibersihkan. Namun, bagaimana jika kamu perlu menjalankan kode khusus pada saat itu, seperti mencatat log, melepaskan resource, atau mengirim pesan terakhir? Trait Drop memungkinkanmu menentukan dengan tepat apa yang terjadi saat struct-mu akan dihancurkan.

Trait Drop memiliki satu method bernama drop yang menerima &mut self:

struct Connection {
    id: u32,
}

impl Drop for Connection {
    fn drop(&mut self) {
        println!("Connection {} closed.", self.id);
    }
}

Kamu tidak pernah memanggil drop secara langsung: Rust memanggilnya secara otomatis saat nilai keluar dari cakupan:

fn main() {
    let conn = Connection { id: 42 };
    println!("Using connection...");
}  // "Connection 42 closed." otomatis tercetak di sini

Outputnya akan menjadi:

Using connection...
Connection 42 closed.

Ini adalah versi Rust dari destructor. Ini biasanya digunakan untuk tugas pembersihan: menutup file handle, memutuskan koneksi dari server, atau membebaskan resource yang tidak dapat dikelola Rust secara otomatis. Trait Drop menjamin kode pembersihanmu berjalan, bahkan jika scope berakhir karena return lebih awal.

challenge icon

Tantangan

Mudah

Mari kita buat sistem pengelolaan resource yang menunjukkan pembersihan otomatis! Kamu akan membuat struct FileHandle yang menyimulasikan pembukaan dan penutupan file. Saat handle keluar dari ruang lingkup, sistem akan otomatis mengumumkan bahwa file telah ditutup.

Kamu akan mengatur kodemu dalam dua file:

  • file_handle.rs: Definisikan struct FileHandle publik dengan field filename publik (String). Implementasikan fungsi terkait new yang membuat FileHandle dan mencetak pesan saat file "opened". Lalu implementasikan trait Drop agar saat handle di-drop, sistem mencetak pesan penutupan.
  • main.rs: Masukkan module file_handle dan buat fungsi bernama process_file yang menerima nama file, membuat FileHandle di dalam ruang lingkup lokal, lalu mencetak pesan pemrosesan saat file "open". Implementasi Drop akan berjalan otomatis saat ruang lingkup berakhir. Panggil fungsi ini dengan input yang diberikan.

Saat FileHandle dibuat, program harus mencetak:

Opening file: {filename}

Saat memproses (di dalam ruang lingkup), cetak:

Processing {filename}...

Saat FileHandle di-drop (ruang lingkup berakhir), program harus mencetak:

Closing file: {filename}

Contohnya, dengan input data.txt:

Opening file: data.txt
Processing data.txt...
Closing file: data.txt

Dan dengan input config.json:

Opening file: config.json
Processing config.json...
Closing file: config.json

Kamu akan menerima satu input: string nama file.

Coba sendiri

mod file_handle;

use file_handle::FileHandle;

// TODO: Implementasikan fungsi process_file
// Fungsi ini harus:
// 1. Buat scope lokal (menggunakan kurung kurawal {})
// 2. Di dalam scope itu, buat FileHandle menggunakan FileHandle::new()
// 3. Cetak pesan pemrosesan: "Processing {filename}..."
// 4. Saat scope berakhir, Drop akan dipanggil secara otomatis
fn process_file(filename: &str) {
    // TODO: Implementasikan fungsi ini
}

fn main() {
    let mut input = String::new();
    std::io::stdin().read_line(&mut input).expect("Failed to read line");
    let filename = input.trim();
    
    process_file(filename);
}
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