Menu
CoddyTech

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
end

Perhatikan 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 PhD

Seperti 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.

challenge icon

Tantangan

Mudah

Mari 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 field text yang 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:

  1. Teks gelar (misalnya, "Engineer")
  2. String awalan yang diletakkan sebelum gelar (misalnya, "Senior ")
  3. 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:

  1. Gabungkan string awalan dengan object title
  2. Gabungkan object title dengan string akhiran

Misalnya, jika inputnya adalah Engineer, Senior , dan III, outputnya seharusnya:

Senior Engineer
Engineer III

Baris 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
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler Lua online