Setter
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Rust di Coddy. Pelajaran 12 dari 61.
Getter memungkinkan kode eksternal membaca data privat. Namun, bagaimana jika kamu perlu mengizinkan kode tersebut mengubah data itu? Di sinilah setter method berperan: method publik yang mengubah field privat dengan cara yang terkendali.
Setter dasar menerima &mut self dan nilai baru:
// wallet.rs
pub struct Wallet {
balance: f64,
}
impl Wallet {
pub fn new(initial: f64) -> Wallet {
Self { balance: initial }
}
pub fn balance(&self) -> f64 {
self.balance
}
pub fn set_balance(&mut self, amount: f64) {
self.balance = amount;
}
}
Berbeda dengan getter, setter Rust biasanya menggunakan awalan set_ untuk menunjukkan dengan jelas bahwa setter mengubah data. Parameter &mut self sangat penting. Parameter ini memberi method izin untuk mengubah field struct.
Kegunaan utama setter adalah validasi. Daripada menerima nilai apa pun begitu saja, kamu bisa menerapkan aturan:
pub fn set_balance(&mut self, amount: f64) {
if amount >= 0.0 {
self.balance = amount;
}
// Nilai negatif diabaikan tanpa pemberitahuan
}
Sekarang wallet melindungi dirinya sendiri: berapa pun nilai yang coba ditetapkan oleh kode eksternal, saldo tidak akan pernah menjadi negatif. Inilah enkapsulasi yang bekerja: struct mengendalikan invariannya sendiri, dan kode eksternal tidak bisa membuatnya berada dalam keadaan yang tidak valid.
Tantangan
MudahMari kita buat sistem termostat yang menunjukkan cara setter dapat menerapkan aturan agar data tetap valid. Termostatmu akan memiliki pengaturan suhu yang hanya dapat disesuaikan dalam rentang yang aman.
Kamu akan membuat dua file untuk mengatur kodemu:
thermostat.rs: Definisikan structThermostatdengan fieldtemperatureprivat (i32). Struct harus bersifat publik, tetapi field-nya tetap privat untuk melindunginya dari nilai yang tidak valid. Implementasikan:- Constructor
newyang menerima suhu awal - Getter
temperatureyang mengembalikan suhu saat ini - Setter
set_temperatureyang hanya menerima nilai antara 10 dan 30 (inklusif). Jika nilainya di luar rentang ini, suhu harus tetap tidak berubah.
- Constructor
main.rs: Impor module termostatmu, buat termostat, lalu tunjukkan validasi setter dengan mencoba mengatur berbagai suhu dan mencetak hasil setelah setiap percobaan.
Setter harus mengabaikan nilai yang tidak valid tanpa memberi tahu: tidak ada pesan error, cukup pertahankan suhu saat ini ketika seseorang mencoba mengaturnya di luar rentang yang valid.
Outputmu harus mengikuti format persis berikut:
Initial: {temperature}
After setting to {attempted_value}: {temperature}
After setting to {attempted_value}: {temperature}Misalnya, jika kamu membuat termostat dengan suhu 20, lalu mencoba mengaturnya ke 25 (valid) dan kemudian ke 50 (tidak valid), outputnya akan berupa:
Initial: 20
After setting to 25: 25
After setting to 50: 25Kamu akan menerima tiga input: suhu awal, suhu pertama yang akan dicoba, dan suhu kedua yang akan dicoba.
Coba sendiri
mod thermostat;
use thermostat::Thermostat;
fn main() {
// Baca input
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let initial_temp: i32 = input1.trim().parse().expect("Invalid number");
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let first_attempt: i32 = input2.trim().parse().expect("Invalid number");
let mut input3 = String::new();
std::io::stdin().read_line(&mut input3).expect("Failed to read line");
let second_attempt: i32 = input3.trim().parse().expect("Invalid number");
// TODO: Buat thermostat dengan suhu awal
// TODO: Tampilkan suhu awal
// Format: "Initial: {temperature}"
// TODO: Coba atur suhu pertama dan tampilkan hasilnya
// Format: "After setting to {attempted_value}: {temperature}"
// TODO: Coba atur suhu kedua dan tampilkan hasilnya
// Format: "After setting to {attempted_value}: {temperature}"
}
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