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
endFonksiyonun 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 PhDDiğ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.
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 birtextalanına sahip Title sınıfınızı tanımlayın. Bir:new(text)yapıcı metodu (constructor) ekleyin ve__concatmetametodunu 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:
- Unvan metni (örneğin, "Engineer")
- Unvandan önce yerleştirilecek bir önek dizesi (örneğin, "Senior ")
- 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:
- Önek dizesini unvan nesnesiyle birleştirin
- 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
endHer İ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
endKullanım Örneği
local person = Name:new("Ada", "Lovelace")
print("Dr. " .. person) -- Output: Dr. Ada Lovelace
print(person .. " PhD") -- Output: Ada Lovelace PhDDiğ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
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
1'Self' Kavramı
Fonksiyonlu TablolarAçık 'self'İki Nokta SözdizimiNokta vs İki NoktaÖzet - Hareket Eden Nokta4Proje: Dijital Banka
Proje KurulumuPara Yatırma Metodu7Çok Biçimlilik ve Geçersiz Kılma
Metotları Geçersiz KılmaÜst Sınıf Metotlarını ÇağırmaDuck TypingOrtak ArayüzTür KontrolüÖzet - Çalışan Rolleri2Sınıf Prototip Kalıbı
Prototip Kavramı__index ile Bağlama:new() KurucusuÖznitelikleri BaşlatmaBağımsız ÖrneklerÖzet - Araba Fabrikası5OOP'de Operatör Aşırı Yükleme
Nesneleri ToplamaNesneleri ÇıkarmaNesneleri BirleştirmeNesneleri Karşılaştırma (<, >)Özet - Cüzdan Matematiği8Kapsülleme
Adlandırma KurallarıGizlilik için Closure'larClosure'lar Aracılığıyla ErişimSalt Okunur TablolarDoğrulama MantığıÖzet - Güvenli Kasa11Tasarım Kalıpları (Lite)
Fabrika FonksiyonlarıSingleton TablosuIterator KalıbıObserver (Dinleyici)Özet - Logger Fabrikası3Nesne Durumu ve Davranışı
Örnek DeğişkenleriGetter MetotlarıSetter MetotlarıHesaplanmış ÖzelliklerString BiçimlendirmeEşitlik KontrolleriÖzet - Öğrenci Notu6Kalıtımın Temelleri
Kalıtım KurulumuMetot KalıtımıConstructor'ı GenişletmeAlt Sınıf Metotları EklemePaylaşılan ve BenzersizÖzet - Şekil Hiyerarşisi