Aritmetik Metametotlar Bölüm 1
Coddy'nin Lua Journey'sinin Logic & Flow bölümünün bir parçası — ders 21 / 54.
__tostring kullanarak bir tabloyu yazdırdığınızda ne olacağını nasıl özelleştireceğinizi öğrendiniz. Şimdi metatabloların, tablolarınız üzerinde + ve - gibi aritmetik operatörler kullandığınızda ne olacağını da tanımlayabildiğini keşfedeceksiniz.
Normalde, iki tabloyu + operatörü ile birbirine eklemeye çalışırsanız, Lua tabloların nasıl toplanacağını bilmediği için size bir hata verecektir. Ancak aritmetik metametotlar ile özel veri türleriniz için toplamanın tam olarak ne anlama geldiğini tanımlayabilirsiniz.
__add metametodu toplama davranışını kontrol eder. Lua, iki değer arasında + operatörüyle karşılaştığında ve en az birinin __add içeren bir metatablosu (metatable) olduğunda, hata üretmek yerine bu fonksiyonu çağırır:
local v1 = {x = 3, y = 4}
local v2 = {x = 1, y = 2}
local meta = {
__add = function(a, b)
return {x = a.x + b.x, y = a.y + b.y}
end
}
setmetatable(v1, meta)
setmetatable(v2, meta)
local v3 = v1 + v2
print(v3.x, v3.y) -- Çıktı: 4 6__add fonksiyonu iki argüman alır: sol işlenen ve sağ işlenen. Bu örnekte, her iki girdi tablosundaki karşılık gelen değerlerin toplamı olan x ve y değerlerine sahip yeni bir tablo oluşturur.
Benzer şekilde, __sub metametodu - operatörü ile çıkarma işlemini kontrol eder:
local meta = {
__sub = function(a, b)
return {x = a.x - b.x, y = a.y - b.y}
end
}
setmetatable(v1, meta)
setmetatable(v2, meta)
local v3 = v1 - v2
print(v3.x, v3.y) -- Çıktı: 2 2Özel operatör davranışı tanımlama yeteneği, operatör aşırı yüklemesi (operator overloading) olarak adlandırılır.
Görev
Kolayx1, y1, x2 ve y2 değerlerini alan ve iki vektörün toplanması sonucunu döndüren bir addVectors fonksiyonu yazın.
Verilen koordinatlarla iki vektör tablosu oluşturun, vektör toplamasını etkinleştirmek için __add metametoduna sahip bir metatablo ekleyin, bunları + operatörünü kullanarak toplayın ve sonucu formatlanmış bir dize olarak döndürün.
Mantık:
x = x1vey = y1anahtarlarıyla ilk vektör tablosunu oluşturunx = x2vey = y2anahtarlarıyla ikinci vektör tablosunu oluşturun- İki vektör alan ve
x = a.x + b.xiley = a.y + b.yiçeren yeni bir tablo döndüren__addiçeren bir metatablo oluşturun setmetatable()kullanarak metatabloyu her iki vektör tablosuna ekleyinv1 + v2kullanarak iki vektörü toplayın- Sonucu
"x y"formatında (x ve y değerleri bir boşlukla ayrılmış şekilde) bir dize olarak döndürün
Parametreler:
x1(sayı): İlk vektörün x-koordinatıy1(sayı): İlk vektörün y-koordinatıx2(sayı): İkinci vektörün x-koordinatıy2(sayı): İkinci vektörün y-koordinatı
Döndürür: İki vektörün toplamını "x y" formatında bir dize olarak (string)
Kopya kağıdı
Metatablolar, tablolar üzerinde + ve - gibi aritmetik operatörleri kullandığınızda ne olacağını tanımlayabilir. Buna operatör aşırı yüklemesi (operator overloading) denir.
__add metametodu, + operatörü ile toplama davranışını kontrol eder:
local v1 = {x = 3, y = 4}
local v2 = {x = 1, y = 2}
local meta = {
__add = function(a, b)
return {x = a.x + b.x, y = a.y + b.y}
end
}
setmetatable(v1, meta)
setmetatable(v2, meta)
local v3 = v1 + v2
print(v3.x, v3.y) -- Output: 4 6__add fonksiyonu iki argüman alır: sol operand ve sağ operand.
__sub metametodu, - operatörü ile çıkarma işlemini kontrol eder:
local meta = {
__sub = function(a, b)
return {x = a.x - b.x, y = a.y - b.y}
end
}
setmetatable(v1, meta)
setmetatable(v2, meta)
local v3 = v1 - v2
print(v3.x, v3.y) -- Output: 2 2Kendin dene
function addVectors(x1, y1, x2, y2)
-- Kodu buraya yazın
end
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Logic & Flow bölümündeki tüm dersler
1İleri Düzey Tablo Yineleme
pairs() ile Yinelemeipairs() ile Yinelemepairs() vs. ipairs()Özet - Karakter Sayfası4Metatable'lara Giriş
Metatable Nedir?setmetatable & getmetatable__index Metametodu__newindex Metametodu__tostring MetametoduAritmetik Metametotlar Bölüm 1Aritmetik Metametotlar Bölüm 2Özet - Salt Okunur Tablo2Daha Fazla Tablo Kütüphanesi Fonksiyonu
table.concat()Tablo Oluşturma ve unpack()table.sort()Fonksiyonlar ile Özel SıralamaÖzet - Yüksek Skor Tablosu