Menggabungkan Objek
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 28 dari 70.
Operator .. di Lua menggabungkan string, tetapi bagaimana jika kamu ingin menggabungkan object dengan string? Method metameta __concat memungkinkan kamu menentukan dengan tepat cara kerjanya.
Saat Lua menemukan a .. b dan salah satu operand memiliki metamethod __concat, Lua memanggil fungsi itu dengan kedua nilai tersebut. Ini berguna saat kamu ingin object menyatu secara alami dalam ekspresi string.
local Name = {}
Name.__index = Name
function Name:new(first, last)
local obj = {first = first, last = last}
setmetatable(obj, Name)
return obj
end
function Name.__concat(a, b)
if type(a) == "string" then
return a .. b.first .. " " .. b.last
else
return a.first .. " " .. a.last .. b
end
endPerhatikan bahwa fungsi memeriksa operand mana yang merupakan string. Karena .. dapat digunakan sebagai "Hello " .. obj atau obj .. "!", metamethod-mu harus menangani kedua kasus.
local person = Name:new("Ada", "Lovelace")
print("Dr. " .. person) -- output: Dr. Ada Lovelace
print(person .. " PhD") -- output: Ada Lovelace PhDSeperti metamethod operator lainnya, __concat menggunakan sintaks titik dan menerima kedua operand sebagai argumen. Perbedaan utamanya dengan metamethod aritmetika adalah kamu biasanya bekerja dengan tipe yang berbeda, yaitu object-mu dan string.
Tantangan
MudahMari buat class Title yang dapat menyatu secara alami ke dalam ekspresi string menggunakan operator ... Ini berguna saat kamu ingin menggabungkan object dengan string dengan cara yang mudah dibaca dan intuitif, seperti menambahkan gelar atau akhiran pada gelar seseorang.
Kamu akan mengatur kodemu dalam dua file:
Title.lua: Definisikan class Title dengan fieldtextyang menyimpan string gelar. Sertakan constructor:new(text)dan implementasikan metamethod__concat. Metamethod-mu harus menangani kedua kasus: saat string berada sebelum object ("prefix" .. obj) dan saat string berada setelahnya (obj .. "suffix"). Hasilnya harus menggabungkan string dengan teks gelar secara tepat.main.lua: Gunakan require untuk module Title-mu, buat instance gelar, dan tunjukkan penggabungan dari kedua arah.
Kamu akan menerima tiga input:
- Teks gelar (misalnya, "Engineer")
- String awalan untuk ditempatkan sebelum gelar (misalnya, "Senior ")
- String akhiran untuk ditempatkan setelah gelar (misalnya, " III")
Di file utama, buat Title dengan teks yang diberikan. Lalu lakukan dua penggabungan dan cetak setiap hasil pada baris terpisah:
- Gabungkan string awalan dengan object gelar
- Gabungkan object gelar dengan string akhiran
Misalnya, jika inputnya adalah Engineer, Senior , dan III, outputnya akan menjadi:
Senior Engineer
Engineer IIIBaris pertama menunjukkan awalan yang digabungkan dengan gelar, dan baris kedua menunjukkan gelar yang digabungkan dengan akhiran. Metamethod __concat-mu memungkinkan penggabungan string ini terasa alami!
Coba sendiri
-- Baca input
local titleText = io.read()
local prefix = io.read()
local suffix = io.read()
-- Muat module Title
local Title = require('Title')
-- TODO: Buat instance Title dengan titleText yang diberikan
-- TODO: Gabungkan prefix dengan object title, lalu cetak hasilnya
-- TODO: Gabungkan object title dengan suffix, lalu cetak hasilnya
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