Nesneleri Toplama
Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 26 / 70.
__tostring ve __eq gibi metametotların nesnelerin nasıl davranacağını özelleştirmenize nasıl olanak tanıdığını zaten gördünüz. Şimdi bunu, toplama işleminden başlayarak aritmetik işlemlere genişleteceğiz.
__add metametodu, iki nesne arasında + operatörünü kullandığınızda ne olacağını tanımlar. Lua a + b ifadesini gördüğünde, her iki operandın metatablosunda __add metodunu arar.
local Vector = {}
Vector.__index = Vector
function Vector:new(x, y)
local obj = {x = x, y = y}
setmetatable(obj, Vector)
return obj
end
function Vector.__add(v1, v2)
return Vector:new(v1.x + v2.x, v1.y + v2.y)
end__add fonksiyonunun iki nokta üst üste ile değil, nokta ile tanımlandığına dikkat edin. Her iki işleneni de argüman olarak alır ve orijinallerden herhangi birini değiştirmek yerine yeni bir nesne döndürmelidir. Bu, işlemi öngörülebilir ve güvenli tutar.
local a = Vector:new(3, 4)
local b = Vector:new(1, 2)
local c = a + b
print(c.x, c.y) -- Çıktı: 4 6Buradaki kilit nokta, __add metodunun sadece nesnenin içinde değil, metatablonun kendisinde (burada Vector) bulunması gerektiğidir. Vector'ı tüm örnekler için metatablo olarak ayarladığımızdan, hepsi bu davranışı otomatik olarak paylaşır.
Görev
Kolay+ operatörünü kullanarak toplama işlemini destekleyen bir Vector sınıfı oluşturalım. Bu, nesnelerinizin Lua'nın yerleşik operatörleriyle doğal bir şekilde çalışmasını sağlayan operatör aşırı yükleme (operator overloading) konusuna ilk adımınız olacak.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
Vector.lua:xveybileşenlerine sahip Vector sınıfınızı tanımlayın. Bir:new(x, y)yapıcı metodu (constructor) ekleyin ve iki vektörün toplanmasının bileşenleri birleştirilmiş yeni bir vektör oluşturması için__addmetametodunu uygulayın.__addmetodunun nokta sözdizimini (iki nokta üst üste değil) kullandığını ve her iki işleneni de argüman olarak aldığını unutmayın.main.lua: Vector modülünüzü dahil edin (require), vektör örnekleri oluşturun ve bunları toplamanın doğru sonucu verdiğini gösterin.
Dört adet girdi alacaksınız:
- Birinci vektörün x bileşeni
- Birinci vektörün y bileşeni
- İkinci vektörün x bileşeni
- İkinci vektörün y bileşeni
Ana dosyanızda, verilen bileşenlerle iki vektör oluşturun, + operatörünü kullanarak bunları birbirine ekleyin ve sonuç vektörünün x ve y değerlerini ayrı satırlara yazdırın.
Örneğin, girdiler 3, 4, 1, 2 ise, çıktı şu şekilde olmalıdır:
4
6Birinci vektör (3, 4) artı ikinci vektör (1, 2), yeni bir vektör olan (4, 6) değerine eşittir.
Kopya kağıdı
__add metametodu, iki nesne arasında + operatörünü kullandığınızda ne olacağını tanımlar.
Lua a + b ifadesini gördüğünde, her iki operandın metatablosunda __add metodunu arar.
local Vector = {}
Vector.__index = Vector
function Vector:new(x, y)
local obj = {x = x, y = y}
setmetatable(obj, Vector)
return obj
end
function Vector.__add(v1, v2)
return Vector:new(v1.x + v2.x, v1.y + v2.y)
end__add iki nokta (:) ile değil, nokta (.) ile tanımlanır. Her iki operandı da argüman olarak alır ve orijinallerini değiştirmek yerine yeni bir nesne döndürmelidir.
local a = Vector:new(3, 4)
local b = Vector:new(1, 2)
local c = a + b
print(c.x, c.y) -- Output: 4 6__add sadece nesnenin içinde değil, metatablonun kendisinde bulunmalıdır.
Kendin dene
-- Vector modülünü dahil et
local Vector = require('Vector')
-- Girdiyi oku
local x1 = tonumber(io.read())
local y1 = tonumber(io.read())
local x2 = tonumber(io.read())
local y2 = tonumber(io.read())
-- YAPILACAK: Girdi değerlerini kullanarak iki Vector örneği oluşturun
-- YAPILACAK: + operatörünü kullanarak iki vektörü toplayın
-- YAPILACAK: Sonuç vektörünün x ve y değerlerini ayrı satırlara 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