Menu
Coddy logo textTech

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, ancak bir nesneyi bir dizeyle birleştirmek isterseniz ne olur? __concat metametodu, bunun tam olarak nasıl çalışması gerektiğini tanımlamanızı sağlar.

Lua, a .. b ile karşılaştığında ve işlenenlerden birinde __concat metametodu bulunduğunda, bu işlevi her iki değerle çağırır. Bu, nesnelerin dize ifadelerine doğal bir şekilde uyum sağlamasını istediğinizde 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 dize olduğunu kontrol ettiğine dikkat edin. .., "Hello " .. obj veya obj .. "!" olarak kullanılabildiğinden, metamethod’unuz 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 metamethod’ları gibi, __concat nokta sözdizimini kullanır ve her iki işleneni de bağımsız değişken olarak alır. Aritmetik metamethod’lardan temel farkı, genellikle farklı türlerle çalışmanızdır: nesneniz ve bir dize.

challenge icon

Görev

Kolay

Title sınıfını, .. operatörünü kullanarak dize ifadelerine doğal bir şekilde dahil olabilecek biçimde oluşturalım. Bu, nesneleri dizelerle okunabilir ve sezgisel bir şekilde birleştirmek istediğinizde; örneğin bir kişinin unvanına saygı ifadeleri veya son ekler eklerken kullanışlıdır.

Kodunuzu iki dosya arasında düzenleyeceksiniz:

  • Title.lua: text alanı aracılığıyla unvan dizesini depolayan Title sınıfınızı tanımlayın. Bir :new(text) oluşturucusu ekleyin ve __concat metamethod'unu uygulayın. Metamethod'unuz her iki durumu da ele almalıdır: 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ü Require edin, 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 ön ek dizesi (ör. "Senior ")
  3. Unvandan sonra yerleştirilecek son ek dizesi (ör. " 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. Ön ek dizesini unvan nesnesiyle birleştirin
  2. Unvan nesnesini son ek dizesiyle birleştirin

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

Senior Engineer
Engineer III

İlk satır, ön ekin unvanla birleştirildiğini; ikinci satır ise unvanın son ekle birleştirildiğini gösterir. __concat metamethod'unuz bu doğal dize birleştirmesini mümkün kı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'i title nesnesiyle 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