Menu
Coddy logo textTech

Drop Trait'i

Coddy'nin Rust Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 56 / 61.

Rust'ta bir değer kapsam dışına çıktığında otomatik olarak temizlenir. Ancak o anda günlük kaydı oluşturmak, bir kaynağı serbest bırakmak veya son bir mesaj göndermek gibi özel kod çalıştırmanız gerekirse ne olur? Drop trait'i, struct'ınız yok edilmek üzereyken tam olarak ne olacağını tanımlamanıza olanak tanır.

Drop trait'inin &mut self alan ve drop adlı tek bir metodu vardır:

struct Connection {
    id: u32,
}

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

drop işlevini hiçbir zaman doğrudan çağırmazsınız: Değer kapsam dışına çıktığında Rust onu otomatik olarak çağırır:

fn main() {
    let conn = Connection { id: 42 };
    println!("Using connection...");
}  // "Connection 42 closed." burada otomatik olarak yazdırılır

Çıktı şöyle olur:

Using connection...
Connection 42 closed.

Bu, Rust'ın yıkıcı işlev sürümüdür. Genellikle temizleme görevleri için kullanılır: dosya tanıtıcılarını kapatmak, sunucularla bağlantıyı kesmek veya Rust'ın otomatik olarak yönetemediği kaynakları serbest bırakmak. Drop trait'i, kapsam erken bir dönüş nedeniyle sona erse bile temizleme kodunuzun çalışmasını garanti eder.

challenge icon

Görev

Kolay

Otomatik temizlemeyi gösteren bir kaynak yönetimi sistemi oluşturalım! Dosyaları açmayı ve kapatmayı simüle eden bir FileHandle struct'ı oluşturacaksın; handle kapsam dışına çıktığında, file'ın kapatıldığını automatically duyuracak.

Code'unu iki file arasında organize edeceksin:

  • file_handle.rs: public bir FileHandle struct'ı ve public bir filename field'ı (String) Define et. Bir FileHandle create eden ve file "opened" olduğunda bir message print eden new associated function implement et. Ardından, handle dropped olduğunda bir kapatma message'ı print etmesi için Drop trait'ini implement et.
  • main.rs: file_handle module'ünü içeri aktar ve bir filename alan process_file called function oluştur; bu function local bir scope Inside FileHandle create etmeli ve file "open" durumdayken bir processing message'ı print etmeli. Drop implementasyonu scope ends olduğunda automatically çalışacak. Bu function'ı provided input ile çağır.

Bir FileHandle oluşturulduğunda şunu print etmeli:

Opening file: {filename}

Processing sırasında (scope'un içinde) şunu print et:

Processing {filename}...

FileHandle dropped olduğunda (scope ends), şunu print etmeli:

Closing file: {filename}

Örneğin, data.txt input'u ile:

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

Ve config.json input'u ile:

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

Bir input alacaksın: filename string'i.

REQUIRED OUTPUT FORMAT: [Çevrilmiş içeriğin burada]

Kendin dene

mod file_handle;

use file_handle::FileHandle;

// TODO: process_file fonksiyonunu uygula
// Şunları yapmalı:
// 1. Yerel bir kapsam oluştur (süslü parantezler {} kullanarak)
// 2. Bu kapsam içinde, FileHandle::new() kullanarak bir FileHandle oluştur
// 3. İşleme mesajını yazdır: "Processing {filename}..."
// 4. Kapsam sona erdiğinde, Drop otomatik olarak çağrılır
fn process_file(filename: &str) {
    // TODO: Bu fonksiyonu uygula
}

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 iconKendini test et

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

Kendi başına pratik yap: Online Rust derleyicisi