Menu
CoddyTech

Nesneleri Birleştirme

Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 28 / 70.

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

Lua, a .. b ifadesiyle karşılaştığında ve işlenenlerden birinin __concat metametodu varsa, bu işlevi her iki değerle birlikte çağırır. Bu, nesnelerin dize ifadelerine doğal bir şekilde dahil olmasını istediğinde kullanışlı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 dizge olduğunu kontrol ettiğine dikkat et. .., "Hello " .. obj veya obj .. "!" biçiminde kullanılabildiğinden, metametodun 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 gelenek gereği noktayla yazılır ve her iki işleneni de argüman olarak alır. Aritmetik metametotlardan temel farkı, genellikle farklı türlerle çalışmanızdır: nesneniz ve bir dize.

challenge icon

Görev

Kolay

.. işleciyle dize ifadelerine doğal biçimde uyum sağlayabilen bir Title sınıfı oluşturalım. Bu, bir kişinin unvanına saygı ifadeleri veya ekler eklemek gibi, nesneleri dizelerle okunaklı ve sezgisel bir şekilde birleştirmek istediğinizde kullanışlıdır.

Kodunuzu iki dosyaya ayıracaksınız:

  • Title.lua: Unvan dizesini saklayan text alanına sahip Title sınıfınızı tanımlayın. Bir :new(text) kurucusu ekleyin ve __concat metayöntemini uygulayın. Metayönteminiz her iki durumu da ele almalı: dize nesneden önce geldiğinde ("prefix" .. obj) ve dize nesneden sonra geldiğinde (obj .. "suffix"). Sonuç, dizeyi unvanın metniyle uygun şekilde birleştirmelidir.
  • main.lua: Title modülünüzü içe aktarın, bir unvan örneği oluşturun ve her iki yöndeki birleştirmeyi gösterin.

Üç girdi alacaksınız:

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

Ana dosyanızda, verilen metinle bir Title oluşturun. Ardından iki birleştirme işlemi yapın 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 öneğin unvanla birleştirilmiş hâlini, ikinci satır ise unvanın sonekle birleştirilmiş hâlini gösterir. __concat metayönteminiz, dizelerin bu şekilde doğal biçimde birleştirilmesini sağlar!

Kendin dene

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

-- Title modülünü yükle
local Title = require('Title')

-- TODO: Verilen titleText ile bir Title örneği oluştur

-- TODO: prefix ile title nesnesini birleştir ve sonucu yazdır

-- TODO: title nesnesini suffix ile birleştir ve sonucu yazdır
quiz iconKendini test et

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

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Lua derleyicisi