Private Alanlar
Coddy'nin Rust Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 10 / 61.
Önceki derste her şeyi herkese açık yaptın: yapıyı, alanlarını ve yöntemlerini. Ancak gerçek kapsülleme, verilerine nasıl erişilebileceğini kontrol etmek anlamına gelir. Rust'ta alanlarını gizli tutarken bir yapıyı herkese açık yapabilirsin.
Negatif bir bakiyeye asla sahip olmaması gereken bir Wallet düşünün. Alan herkese açıksa herkes onu herhangi bir değere ayarlayabilir:
// wallet.rs
pub struct Wallet {
balance: f64, // pub yok = private!
}
impl Wallet {
pub fn new(initial: f64) -> Wallet {
Wallet { balance: initial }
}
}
Wallet'ın herkese açık olduğuna, ancak balance'ın pub anahtar sözcüğüne sahip olmadığına dikkat edin. Bu, modülün dışındaki kodun oluşturucuyu kullanarak bir Wallet oluşturabileceği, ancak balance alanını doğrudan okuyamayacağı veya değiştiremeyeceği anlamına gelir:
// main.rs
mod wallet;
use wallet::Wallet;
fn main() {
let w = Wallet::new(100.0);
// println!("{}", w.balance); // Hata! alan özel
// w.balance = -50.0; // Hata! özel alana erişilemez
}
Bu, kapsüllemenin temelidir: struct kendi verilerini kontrol eder. Harici kod, sağladığınız metotlar üzerinden ilerlemelidir; bu da doğrulama, günlük kaydı veya başka herhangi bir mantık ekleyebileceğiniz anlamına gelir. Veriler geçersiz durumlardan korunur.
Yaklaşan derslerde, getter ve setter yöntemleri aracılığıyla bu özel verilere kontrollü erişim sağlamayı öğreneceksin.
Görev
KolayHassas verileri bir modül içinde koruyarak kapsüllemeyi gösteren bir sıcaklık sensörü sistemi oluşturalım.
Kodunuzu düzenlemek için iki dosya oluşturacaksınız:
sensor.rs: İki alana sahip birTemperatureSensoryapısı tanımlayın:location(String) vereading(f64). Yapı, diğer dosyalardan kullanılabilmesi için herkese açık olmalı; ancak her iki alanı da özel tutun: dış kod, sensörün verilerine doğrudan erişememeli veya bu verileri değiştirememelidir. Bir konum adı ve başlangıç sıcaklık değerini alan herkese açık birnewoluşturucusu ekleyin.main.rs: Sensör modülünü içeri aktarın ve oluşturucuyu kullanarak birTemperatureSensoroluşturun. Alanlar özel olduğundan bunları doğrudan yazdıramayacaksınız; bunun yerine sensörün başarıyla oluşturulduğunu gösteren bir onay mesajı yazdırın.
Bu görev, özel alanların temel kavramına odaklanır: yapıya erişilebilir, ancak iç verileri korunur. Dış kod, sensörle yalnızca sağladığınız yöntemler aracılığıyla etkileşime girebilir (bu durumda yalnızca oluşturucu aracılığıyla).
Çıktınız tam olarak şu biçimi izlemelidir:
Sensor created for: {location}Konumu yazdırmak için new işlevinizin sensörü döndürmeden önce bu mesajı yazdırması gerekir; çünkü alanın kendisi özeldir.
Örneğin, konumu "Kitchen" ve değeri 22.5 olan bir sensör oluşturursanız çıktı şöyle olur:
Sensor created for: Kitchenİki girdi alacaksınız: konum adı ve başlangıç sıcaklık değeri.
Kendin dene
mod sensor;
use sensor::TemperatureSensor;
fn main() {
// Girişi oku
let mut location = String::new();
std::io::stdin().read_line(&mut location).expect("Failed to read line");
let location = location.trim().to_string();
let mut reading_str = String::new();
std::io::stdin().read_line(&mut reading_str).expect("Failed to read line");
let reading: f64 = reading_str.trim().parse().expect("Failed to parse reading");
// TODO: Kurucuyu kullanarak bir TemperatureSensor oluştur
// new fonksiyonu onay mesajını yazdırmayı halledecek
}
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