Memformat string
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 16 dari 70.
Saat kamu mencetak object secara langsung, Lua menampilkan sesuatu yang tidak membantu, seperti table: 0x55a.... Itu hanya alamat memori. Metamethod __tostring memungkinkan kamu menentukan string yang mewakili object saat dicetak atau diubah menjadi teks.
Dalam pola class, kamu menambahkan __tostring sebagai fungsi di tabel class-mu. Karena class itu sendiri berfungsi sebagai metatable untuk instance, Lua otomatis menemukan dan menggunakan fungsi ini:
local Player = {}
Player.__index = Player
function Player:new(name, level)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.level = level
return instance
end
function Player:__tostring()
return "Player: " .. self.name .. " (Level " .. self.level .. ")"
endSekarang, saat kamu mencetak sebuah instance Player, Lua otomatis memanggil method __tostring milikmu:
local hero = Player:new("Luna", 5)
print(hero) -- output: Player: Luna (Level 5)Perhatikan bahwa __tostring menggunakan sintaks titik dua dan menerima self, sehingga kamu dapat mengakses semua data instance. Fungsi ini harus mengembalikan string. Kamu dapat memformatnya sesuai kebutuhan object-mu, dengan menggabungkan atribut apa pun menjadi representasi yang mudah dibaca.
Tantangan
MudahMari buat class Book yang tahu cara memperkenalkan dirinya! Saat kamu langsung mencetak buku, Lua akan menampilkan string dengan format yang rapi, bukan alamat memori yang sulit dipahami: semua berkat metamethod __tostring.
Kamu akan menyusun kodemu dalam dua file:
Book.lua: Definisikan classBookdengan pola prototipe standar. Setiap buku harus menyimpantitledanauthor. Sertakan konstruktor:new(title, author)dan implementasikan metamethod__tostringagar saat buku dicetak, informasinya ditampilkan dalam format yang mudah dibaca.main.lua: Require module Book-mu, buat instance buku, lalu cetak langsung untuk melihat pemformatan string kustommu.
Method __tostring-mu harus mengembalikan string dengan format persis seperti ini:
"[title]" by [author]Perhatikan bahwa judul diapit tanda kutip ganda di dalam string output.
Kamu akan menerima empat input:
- Judul buku pertama
- Penulis buku pertama
- Judul buku kedua
- Penulis buku kedua
Di file utama, buat dua buku menggunakan input yang diberikan, lalu cetak setiap buku secara langsung (bukan dengan memanggil method, cukup print(book)). Setiap buku harus muncul pada barisnya sendiri.
Misalnya, jika inputnya adalah The Hobbit, J.R.R. Tolkien, 1984, dan George Orwell, outputnya harus seperti ini:
"The Hobbit" by J.R.R. Tolkien
"1984" by George OrwellIngat, __tostring harus mengembalikan string. Karena tabel class-mu berfungsi sebagai metatable untuk instance, Lua akan otomatis menemukan dan menggunakan fungsi __tostring-mu saat kamu mencetak buku.
Coba sendiri
-- Muat module Book dengan require
local Book = require('Book')
-- Baca input
local title1 = io.read()
local author1 = io.read()
local title2 = io.read()
local author2 = io.read()
-- TODO: Buat dua object buku menggunakan Book:new()
-- TODO: Cetak setiap buku secara langsung (cukup gunakan print(book))
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