Aritmetik Metametotlar Bölüm 2
Coddy'nin Lua Journey'sinin Logic & Flow bölümünün bir parçası — ders 22 / 54.
Toplama ve çıkarmaya ek olarak, __mul ve __div metametotlarını kullanarak tablolarınız için çarpma ve bölme davranışlarını da tanımlayabilirsiniz. Bunlar __add ve __sub ile aynı şekilde çalışır, ancak * ve / operatörlerine yanıt verirler.
__mul metametodu, bir tablonun değerlerini ölçeklendirmek istediğinizde özellikle yararlıdır. Örneğin, bir vektörü bir sayıyla (skaler olarak adlandırılır) çarpmak her bir bileşeni çarpmalıdır:
local vector = {x = 3, y = 4}
local meta = {
__mul = function(a, b)
local scalar = type(a) == "number" and a or b
local vec = type(a) == "table" and a or b
return {x = vec.x * scalar, y = vec.y * scalar}
end
}
setmetatable(vector, meta)
local scaled = vector * 2
print(scaled.x, scaled.y) -- Çıktı: 6 8Fonksiyonun hangi işlenenin sayı, hangisinin tablo olduğunu nasıl kontrol ettiğine dikkat edin. Bu, hem vector * 2 hem de 2 * vector ifadesinin doğru çalışmasını sağlar.
__div metametodu bölme işlemi için benzer şekilde çalışır:
local meta = {
__div = function(a, b)
return {x = a.x / b, y = a.y / b}
end
}
setmetatable(vector, meta)
local divided = vector / 2
print(divided.x, divided.y) -- Çıktı: 1.5 2Bu metametotlar, özel türleriniz için temel aritmetik işlemleri tamamlayarak matematiksel operatörlerin tablolarınızla nasıl davranacağı konusunda size tam kontrol sağlar.
Görev
Kolayx, y ve scalar değerlerini alan ve ölçeklenmiş vektörü formatlanmış bir dize olarak döndüren bir scaleVector fonksiyonu yazın.
Verilen koordinatlarla bir vektör tablosu oluşturun, skaler çarpmayı etkinleştirmek için __mul metametoduna sahip bir metatablo ekleyin, vektörü * operatörünü kullanarak skaler ile çarpın ve sonucu döndürün.
Mantık:
xveyanahtarları sağlanan koordinatlara ayarlanmış bir vektör tablosu oluşturun- Bir vektör ile bir skaler arasındaki çarpmayı işleyen
__muliçeren bir metatablo oluşturun __mulfonksiyonu, hangi operanda sayının hangisinin tablo olduğunu kontrol etmelidirx = vec.x * scalarvey = vec.y * scalariçeren yeni bir tablo döndürünsetmetatable()kullanarak metatabloyu vektör tablosuna ekleyinvector * scalarkullanarak vektörü skaler ile çarpın- Sonucu
"x y"formatında (bir boşlukla ayrılmış x ve y değerleri) bir dize olarak döndürün
Parametreler:
x(sayı): Vektörün x koordinatıy(sayı): Vektörün y koordinatıscalar(sayı): Vektörün çarpılacağı skaler değer
Döndürür: "x y" formatında dize olarak ölçeklenmiş vektör (string)
Kopya kağıdı
__mul ve __div metametotları, * ve / operatörlerine yanıt vererek tablolar için çarpma ve bölme davranışlarını tanımlar.
__mul metametodu, tablo değerlerini ölçeklendirmek için kullanışlıdır. Bir vektörü bir skaler ile çarparken, hem vector * 2 hem de 2 * vector işlemlerine izin vermek için hangi operanda sayı, hangisinin tablo olduğunu kontrol edin:
local vector = {x = 3, y = 4}
local meta = {
__mul = function(a, b)
local scalar = type(a) == "number" and a or b
local vec = type(a) == "table" and a or b
return {x = vec.x * scalar, y = vec.y * scalar}
end
}
setmetatable(vector, meta)
local scaled = vector * 2
print(scaled.x, scaled.y) -- Output: 6 8__div metametodu bölme işlemi için benzer şekilde çalışır:
local meta = {
__div = function(a, b)
return {x = a.x / b, y = a.y / b}
end
}
setmetatable(vector, meta)
local divided = vector / 2
print(divided.x, divided.y) -- Output: 1.5 2Kendin dene
function scaleVector(x, y, scalar)
-- Kodunuzu 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