Menu
Coddy logo textTech

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  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)

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  2

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.

Logic & Flow bölümündeki tüm dersler