Titik vs Titik Dua
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 4 dari 70.
Sekarang setelah kamu memahami sintaks titik dan titik dua, penting untuk memahami kapan menggunakan masing-masing dan apa yang terjadi jika kamu mencampurnya dengan cara yang keliru.
Aturan utamanya sederhana: cara kamu mendefinisikan fungsi harus sesuai dengan cara kamu memanggilnya. Jika kamu mendefinisikannya dengan titik dua, panggil dengan titik dua. Jika kamu mendefinisikannya dengan titik dan self eksplisit, panggil dengan titik dan teruskan tabelnya.
Inilah yang terjadi saat kamu mencocokkan keduanya dengan tidak tepat:
local game = { score = 0 }
function game:addPoints(points)
self.score = self.score + points
end
-- SALAH: memanggil dengan titik, tetapi tidak meneruskan tabel
game.addPoints(10) -- error! self sekarang bernilai 10, bukan tabelSaat kamu memanggil game.addPoints(10), Lua tidak otomatis meneruskan game. Nilai 10 menjadi self, sehingga menyebabkan perilaku yang tidak terduga atau error.
Arah sebaliknya lebih mudah ditoleransi:
function game.reset(self)
self.score = 0
end
-- Memanggil dengan tanda titik dua: game:reset() sama dengan game.reset(game)
game:reset() -- self menerima game dengan benar, jadi ini berfungsiMeski kasus khusus ini mungkin berhasil, hal ini menimbulkan kebingungan dan dapat merusak fungsi yang mengharapkan argumen tertentu. Cara paling aman adalah tetap konsisten: gunakan titik dua untuk definisi dan pemanggilan jika fungsi memerlukan self, dan gunakan titik jika tidak.
Tantangan
MudahBuat tabel bernama player dengan field score yang diinisialisasi dengan 0.
Tambahkan dua fungsi ke tabel:
player.setScore(self, value)- didefinisikan dengan sintaks titik dan parameterselfyang eksplisit. Menetapkanself.scoreke nilai yang diberikan.player:addBonus(amount)- didefinisikan dengan sintaks titik dua. Menambahkanamountkeself.score.
Kamu akan menerima dua input:
- Nilai skor awal
- Jumlah bonus yang akan ditambahkan
Lakukan langkah-langkah berikut:
- Panggil
setScoremenggunakan sintaks titik (dengan meneruskan tabel sebagai argumen pertama) untuk menetapkan skor awal - Panggil
addBonusmenggunakan sintaks titik dua untuk menambahkan bonus - Cetak nilai akhir
player.score
Ingat: sesuaikan cara kamu memanggil setiap fungsi dengan cara fungsi tersebut didefinisikan.
Coba sendiri
-- Baca input
local initialScore = tonumber(io.read())
local bonusAmount = tonumber(io.read())
-- TODO: Tulis kodemu di bawah ini
-- 1. Buat tabel bernama 'player' dengan field 'score' yang diinisialisasi ke 0
-- 2. Tambahkan player.setScore(self, value) menggunakan sintaks titik dengan self yang ditulis secara eksplisit
-- 3. Tambahkan player:addBonus(amount) menggunakan sintaks titik dua
-- 4. Panggil setScore menggunakan sintaks titik (dengan meneruskan tabel sebagai argumen pertama)
-- 5. Panggil addBonus menggunakan sintaks titik dua
-- Tampilkan nilai akhir score
print(player.score)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