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? Metamethod __concat memungkinkanmu menentukan dengan tepat cara kerjanya.
Saat Lua menemukan a .. b dan salah satu operand memiliki metamethod __concat, Lua memanggil fungsi tersebut dengan kedua nilai. 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 ditulis dengan titik berdasarkan konvensi dan menerima kedua operand sebagai argumen. Perbedaan utama dari metamethod aritmetika adalah kamu biasanya bekerja dengan tipe yang berbeda, yaitu objekmu dan string.
Tantangan
MudahMari kita membuat class Title yang dapat menyatu secara alami dalam ekspresi string menggunakan operator ... Ini berguna saat kamu ingin menggabungkan object dengan string secara mudah dibaca dan intuitif, seperti menambahkan sapaan kehormatan atau akhiran pada gelar seseorang.
Kamu akan menyusun kodemu dalam dua file:
Title.lua: Definisikan class Title dengan fieldtextyang menyimpan string gelar. Sertakan konstruktor:new(text)dan implementasikan metamethod__concat. Metamethod-mu harus menangani kedua kasus: ketika string berada sebelum object ("prefix" .. obj) dan ketika string berada setelahnya (obj .. "suffix"). Hasilnya harus menggabungkan string dengan teks gelar secara tepat.main.lua: Gunakan perintah require untuk memuat module Title-mu, buat sebuah instance Title, lalu tunjukkan penggabungan dari kedua arah.
Kamu akan menerima tiga input:
- Teks gelar (misalnya, "Engineer")
- String awalan yang diletakkan sebelum gelar (misalnya, "Senior ")
- String akhiran yang diletakkan 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 title
- Gabungkan object title dengan string akhiran
Misalnya, jika inputnya adalah Engineer, Senior , dan III, outputnya seharusnya:
Senior Engineer
Engineer IIIBaris pertama menunjukkan awalan yang digabungkan dengan gelar, dan baris kedua menunjukkan gelar yang digabungkan dengan akhiran. Metamethod __concat milikmu memungkinkan penggabungan string ini dilakukan secara 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