Field private
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Rust di Coddy. Pelajaran 10 dari 61.
Di pelajaran sebelumnya, kamu membuat semuanya bersifat publik: struct, field, dan method-nya. Namun, enkapsulasi yang sebenarnya berarti mengendalikan bagaimana datamu dapat diakses. Di Rust, kamu dapat membuat struct bersifat publik sambil menjaga field-nya tetap privat.
Bayangkan sebuah Wallet yang saldonya tidak boleh negatif. Jika field-nya bersifat publik, siapa pun bisa mengaturnya ke nilai apa pun:
// wallet.rs
pub struct Wallet {
balance: f64, // Tanpa pub = private!
}
impl Wallet {
pub fn new(initial: f64) -> Wallet {
Wallet { balance: initial }
}
}
Perhatikan bahwa Wallet bersifat publik, tetapi balance tidak memiliki kata kunci pub. Artinya, kode di luar module dapat membuat Wallet menggunakan konstruktor, tetapi tidak dapat membaca atau mengubah field balance secara langsung:
// main.rs
mod wallet;
use wallet::Wallet;
fn main() {
let w = Wallet::new(100.0);
// println!("{}", w.balance); // error! field bersifat privat
// w.balance = -50.0; // error! tidak bisa mengakses field privat
}
Inilah dasar enkapsulasi: struct mengendalikan datanya sendiri. Kode eksternal harus menggunakan method yang kamu sediakan, sehingga kamu bisa menambahkan validasi, pencatatan log, atau logika lainnya. Data tetap terlindungi dari keadaan yang tidak valid.
Dalam pelajaran berikutnya, kamu akan belajar cara memberikan akses terkontrol ke data privat ini melalui method getter dan setter.
Tantangan
MudahMari kita bangun sistem sensor suhu yang menunjukkan enkapsulasi dengan melindungi data sensitif di dalam sebuah module.
Kamu akan membuat dua file untuk mengatur kodemu:
sensor.rs: Definisikan structTemperatureSensordengan dua field:location(String) danreading(f64). Struct ini harus bersifat publik agar dapat digunakan dari file lain, tetapi biarkan kedua field tetap privat: kode eksternal tidak boleh mengakses atau mengubah data sensor secara langsung. Tambahkan constructor publiknewyang menerima nama lokasi dan pembacaan suhu awal.main.rs: Sertakan module sensor dan buatTemperatureSensormenggunakan constructor. Karena field-nya privat, kamu tidak akan bisa mencetaknya secara langsung. Sebagai gantinya, cetak pesan konfirmasi yang menunjukkan bahwa sensor berhasil dibuat.
Tantangan ini berfokus pada konsep inti field privat: struct dapat diakses, tetapi data internalnya dilindungi. Kode eksternal hanya dapat berinteraksi dengan sensor melalui method yang kamu sediakan, dalam hal ini hanya constructor.
Output-mu harus mengikuti format persis berikut:
Sensor created for: {location}Untuk mengakses lokasi agar dapat dicetak, kamu perlu membuat fungsi new mencetak pesan ini sebelum mengembalikan sensor, karena field itu sendiri bersifat privat.
Misalnya, jika kamu membuat sensor dengan lokasi "Kitchen" dan pembacaan 22.5, output-nya adalah:
Sensor created for: KitchenKamu akan menerima dua input: nama lokasi dan pembacaan suhu awal.
Coba sendiri
mod sensor;
use sensor::TemperatureSensor;
fn main() {
// Baca input
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: Buat TemperatureSensor menggunakan konstruktor
// Fungsi new akan mencetak pesan konfirmasi
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Method dan Perilaku
Pengantar Blok ImplementasiParameter SelfMethod MutableFungsi TerkaitBeberapa Blok ImplementasiMethod BerantaiRangkuman: Aksi Persegi Panjang4Proyek: Hewan Peliharaan Virtual
Mendefinisikan Hewan PeliharaanMemberi Makan Hewan Peliharaan2Enkapsulasi dan module
Dasar-Dasar moduleKata Kunci publicField privateGetterSetterRekap: Loker AmanLatihan sendiri: Compiler Rust online