Aritmetik Metametotlar Bölüm 2
Coddy'nin Lua Journey'sinin Mantık ve Akış 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)
Kendin 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.
Mantık ve Akış 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