Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

x1, 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 = x1 ve y = y1 anahtarlarıyla ilk vektör tablosunu oluşturun
  • x = x2 ve y = y2 anahtarlarıyla ikinci vektör tablosunu oluşturun
  • İki vektör alan ve x = a.x + b.x ile y = a.y + b.y içeren yeni bir tablo döndüren __add içeren bir metatablo oluşturun
  • setmetatable() kullanarak metatabloyu her iki vektör tablosuna ekleyin
  • v1 + v2 kullanarak 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  2

Kendin dene

function addVectors(x1, y1, x2, y2)
    -- Kodu 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