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.
Görev
KolayOtomatik 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 birFileHandlestruct'ı ve public birfilenamefield'ı (String) Define et. Bir FileHandle create eden ve file "opened" olduğunda bir message print edennewassociated function implement et. Ardından, handle dropped olduğunda bir kapatma message'ı print etmesi içinDroptrait'ini implement et.main.rs: file_handle module'ünü içeri aktar ve bir filename alanprocess_filecalled 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.txtVe config.json input'u ile:
Opening file: config.json
Processing config.json...
Closing file: config.jsonBir input alacaksın: filename string'i.
REQUIRED OUTPUT FORMAT: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);
}
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ı Besleme2Kapsü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