Menu
Coddy logo textTech

Nesneleri Birleştirme

Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 28 / 70.

Lua'daki .. operatörü dizeleri birleştirir, ancak bir nesneyi bir dizeyle birleştirmek isterseniz ne olur? __concat metametodu, bunun tam olarak nasıl çalışması gerektiğini tanımlamanıza olanak tanır.

Lua a .. b ile karşılaştığında ve işlenenlerden birinin bir __concat metametodu olduğunda, bu fonksiyonu her iki değerle birlikte çağırır. Bu, nesnelerin dize ifadelerine doğal bir şekilde karışmasını istediğinizde yararlıdır.

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

Fonksiyonun hangi işlenenin dize olduğunu kontrol ettiğine dikkat edin. .. operatörü "Hello " .. obj veya obj .. "!" şeklinde kullanılabileceği için, metayönteminiz her iki durumu da ele almalıdır.

local person = Name:new("Ada", "Lovelace")

print("Dr. " .. person)      -- Çıktı: Dr. Ada Lovelace
print(person .. " PhD")      -- Çıktı: Ada Lovelace PhD

Diğer operatör metametotları gibi, __concat nokta sözdizimini kullanır ve her iki işleneni de argüman olarak alır. Aritmetik metametotlardan temel farkı, genellikle karma tiplerle —nesneniz ve bir dize— çalışıyor olmanızdır.

challenge icon

Görev

Kolay

.. operatörünü kullanarak dize ifadelerine doğal bir şekilde karışabilen bir Title sınıfı oluşturalım. Bu, nesneleri dizelerle okunabilir ve sezgisel bir şekilde birleştirmek istediğinizde (bir kişinin unvanına saygı ifadeleri veya son ekler eklemek gibi) kullanışlıdır.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • Title.lua: Unvan dizesini saklayan bir text alanına sahip Title sınıfınızı tanımlayın. Bir :new(text) yapıcı metodu (constructor) ekleyin ve __concat metametodunu uygulayın. Metametodunuz her iki durumu da ele almalıdır: nesneden önce bir dize geldiğinde ("prefix" .. obj) ve nesneden sonra bir dize geldiğinde (obj .. "suffix"). Sonuç, dizeyi unvanın metniyle uygun şekilde birleştirmelidir.
  • main.lua: Title modülünüzü dahil edin (require), bir unvan örneği oluşturun ve her iki yönden birleştirmeyi gösterin.

Üç girdi alacaksınız:

  1. Unvan metni (örneğin, "Engineer")
  2. Unvandan önce yerleştirilecek bir önek dizesi (örneğin, "Senior ")
  3. Unvandan sonra yerleştirilecek bir sonek dizesi (örneğin, " III")

Ana dosyanızda, verilen metinle bir Title oluşturun. Ardından iki birleştirme işlemi gerçekleştirin ve her sonucu ayrı bir satıra yazdırın:

  1. Önek dizesini unvan nesnesiyle birleştirin
  2. Unvan nesnesini sonek dizesiyle birleştirin

Örneğin, girdiler Engineer, Senior ve III ise, çıktı şöyle olmalıdır:

Senior Engineer
Engineer III

İlk satır unvanla birleştirilmiş öneki, ikinci satır ise sonekle birleştirilmiş unvanı gösterir. __concat metametodunuz bu doğal dize harmanlamasını mümkün kılar!

Kopya kağıdı

__concat metametodu, nesnelerle çalışırken .. birleştirme operatörü için özel davranış tanımlamanıza olanak tanır.

Lua a .. b ile karşılaştığında ve işlenenlerden biri __concat metametoduna sahip olduğunda, bu fonksiyonu her iki değerle birlikte çağırır.

Temel Uygulama

local MyClass = {}
MyClass.__index = MyClass

function MyClass:new(value)
    local obj = {value = value}
    setmetatable(obj, MyClass)
    return obj
end

function MyClass.__concat(a, b)
    if type(a) == "string" then
        return a .. b.value
    else
        return a.value .. b
    end
end

Her İki İşlenen Sırasını Ele Alma

.. operatörü "string" .. obj veya obj .. "string" şeklinde kullanılabileceği için, metametodunuz hangi işlenenin dize olduğunu kontrol etmeli ve her iki durumu da ele almalıdır:

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

Kullanım Örneği

local person = Name:new("Ada", "Lovelace")

print("Dr. " .. person)      -- Output: Dr. Ada Lovelace
print(person .. " PhD")      -- Output: Ada Lovelace PhD

Diğer operatör metametodları gibi, __concat nokta sözdizimini kullanır ve her iki işleneni de argüman olarak alır.

Kendin dene

-- Girdileri oku
local titleText = io.read()
local prefix = io.read()
local suffix = io.read()

-- Title modülünü dahil et
local Title = require('Title')

-- YAPILACAK: Verilen titleText ile bir Title örneği oluşturun

-- YAPILACAK: prefix'i title nesnesiyle birleştirin ve sonucu yazdırın

-- YAPILACAK: title nesnesini suffix ile birleştirin ve sonucu yazdırın
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Object Oriented Programming bölümündeki tüm dersler