Menu
Coddy logo textTech

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  8

Fonksiyonun 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  2

Bu 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.

challenge icon

Görev

Kolay

x, 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:

  • x ve y anahtarları sağlanan koordinatlara ayarlanmış bir vektör tablosu oluşturun
  • Bir vektör ile bir skaler arasındaki çarpmayı işleyen __mul içeren bir metatablo oluşturun
  • __mul fonksiyonu, hangi operanda sayının hangisinin tablo olduğunu kontrol etmelidir
  • x = vec.x * scalar ve y = vec.y * scalar içeren yeni bir tablo döndürün
  • setmetatable() kullanarak metatabloyu vektör tablosuna ekleyin
  • vector * scalar kullanarak 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
quiz iconKendini test et

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

Kendi başına pratik yap: Online Lua derleyicisi