Tabel Hanya-Baca
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 46 dari 70.
Closure memberikan privasi yang sesungguhnya, tetapi closure mengharuskan kamu mendefinisikan method di dalam constructor. Ada pendekatan lain untuk kasus penggunaan yang berbeda: membuat object hanya dapat dibaca setelah dibuat. Ini berguna ketika kamu ingin field terlihat tetapi tidak dapat diubah, seperti koordinat titik tetap.
Metamethod __newindex mencegat upaya untuk menetapkan nilai baru ke tabel. Dengan membuatnya memblokir semua penetapan, kamu dapat membekukan object:
local ImmutablePoint = {}
function ImmutablePoint.new(x, y)
local data = {x = x, y = y}
local proxy = {}
setmetatable(proxy, {
__index = data,
__newindex = function()
error("Cannot modify immutable object")
end
})
return proxy
endTriknya adalah menggunakan tabel proxy. Data sebenarnya berada di data, sedangkan pengguna berinteraksi dengan proxy yang kosong.
Saat membaca, __index mengambil data dari data. Saat menulis, __newindex justru dijalankan, dan kita memblokirnya:
local p = ImmutablePoint.new(10, 20)
print(p.x) -- 10 (pembacaan berhasil)
p.x = 50 -- error: Tidak dapat mengubah object yang tidak dapat diubahPola ini berguna untuk object konfigurasi, konstanta matematika, atau data apa pun yang tidak boleh berubah setelah inisialisasi. Object tetap dapat dibaca sepenuhnya. Kamu hanya tidak bisa mengubahnya.
Tantangan
MudahMari buat class ImmutableConfig yang membuat object konfigurasi hanya-baca! Setelah dibuat, object konfigurasi ini harus mengizinkan pembacaan pengaturannya, tetapi sepenuhnya memblokir semua upaya untuk mengubahnya.
Kamu akan menyusun kodemu dalam dua file:
ImmutableConfig.lua: Buat module yang menghasilkan object konfigurasi yang dibekukan. Fungsi.new(appName, version, maxUsers)harus menyimpan ketiga nilai ini secara internal, lalu mengembalikan tabel proxy yang mengizinkan pembacaan semua field, tetapi mencegah perubahan apa pun. Saat seseorang mencoba mengubah suatu nilai, program harus mencetakError: Config is read-only, bukan memunculkan error sungguhan.main.lua: Buat ImmutableConfig berfungsi! Baca tiga input untuk nilai konfigurasi, buat object konfigurasi, lalu tunjukkan bahwa object tersebut berfungsi dengan benar dengan cara:- Mencetak ketiga nilai awal
- Mencoba mengubah field
maxUsers(yang seharusnya memicu pesan error) - Mencetak
maxUserssekali lagi untuk membuktikan bahwa nilainya tidak benar-benar berubah
Kamu akan menerima tiga input:
- Nama aplikasi (sebuah string)
- Versi (sebuah string)
- Jumlah pengguna maksimum (sebuah angka)
Output-mu harus menampilkan nilai konfigurasi, error saat perubahan dicoba, dan konfirmasi bahwa nilainya tetap tidak berubah:
App: {appName}
Version: {version}
Max Users: {maxUsers}
Error: Config is read-only
Max Users: {maxUsers}Misalnya, jika input-nya adalah MyApp, 2.0, dan 100, output-nya adalah:
App: MyApp
Version: 2.0
Max Users: 100
Error: Config is read-only
Max Users: 100Ingat: pola proxy menggunakan tabel kosong yang berinteraksi dengan pengguna, sementara data sebenarnya berada di tabel internal yang terpisah. Metamethod __index mengambil data dari tabel tersebut, dan __newindex menangkap serta memblokir semua upaya penulisan!
Coba sendiri
-- Impor module ImmutableConfig
local ImmutableConfig = require('ImmutableConfig')
-- Baca input
local appName = io.read()
local version = io.read()
local maxUsers = tonumber(io.read())
-- TODO: Buat object konfigurasi menggunakan ImmutableConfig.new()
-- TODO: Cetak ketiga nilai awal dengan format berikut:
-- Aplikasi: {appName}
-- Versi: {version}
-- Pengguna Maksimal: {maxUsers}
-- TODO: Coba ubah field maxUsers (ini seharusnya memunculkan pesan error)
-- TODO: Cetak maxUsers lagi untuk membuktikan nilainya tidak berubah
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Konsep "Self"
Tabel dengan Fungsi'self' EksplisitSintaks Titik DuaTitik vs Titik DuaRangkuman, Titik Bergerak4Proyek: Bank Digital
Penyiapan Proyekmethod Setoran7Polimorfisme & Overriding
Menimpa methodMemanggil method indukDuck TypingAntarmuka UmumMemeriksa TipeRingkasan: Peran Karyawan10Proyek: Pengelola Bentuk
Penyiapan Proyekclass Rectangleclass Circlemethod KelilingKumpulan BentukLuas TotalSaring Bentuk2Pola Prototype untuk class
Konsep PrototypeMenghubungkan dengan __indexKonstruktor :new()Menginisialisasi AtributInstans yang MandiriRangkuman: Pabrik Mobil5Pembebanan Operator dalam OOP
Menjumlahkan ObjekMengurangkan ObjekMenggabungkan ObjekMembandingkan Objek (<, >)Ulasan: Aritmetika Dompet8Enkapsulasi
Konvensi PenamaanClosure untuk PrivasiAkses melalui ClosureTabel Hanya-BacaLogika ValidasiRangkuman: Brankas Aman11Pola Desain (Ringan)
Fungsi FactoryTabel SingletonPola IteratorObserver (Listener)Rangkuman, Factory Logger3State dan Behavior pada object
Variabel InstansGetter methodSetter methodProperty TerhitungMemformat stringPemeriksaan KesetaraanRangkuman: Nilai Siswa6Dasar-Dasar Pewarisan
Menyiapkan PewarisanMewarisi methodMemperluas KonstruktorMenambahkan method untuk ChildSama vs UnikRangkuman: Hierarki BentukLatihan sendiri: Compiler Lua online