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

challenge icon

Tantangan

Mudah

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

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

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

Misalnya, jika inputnya adalah Engineer, Senior , dan III, outputnya akan menjadi:

Senior Engineer
Engineer III

Baris 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
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