Menu
CoddyTech

Nesneleri Toplama

Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 26 / 70.

__tostring ve __eq gibi metametotların nesnelerin davranışını özelleştirmenizi sağladığını zaten gördünüz. Şimdi bunu aritmetik işlemlere genişleteceğiz; toplama ile başlayalım.

__add metayöntemi, iki nesne arasında + operatörünü kullandığında ne olacağını tanımlar. Lua, a + b ifadesini gördüğünde, her iki işlenenden birinin metatablosunda __add olup olmadığına bakar.

local Vector = {}
Vector.__index = Vector

function Vector:new(x, y)
    local obj = {x = x, y = y}
    setmetatable(obj, Vector)
    return obj
end

function Vector.__add(v1, v2)
    return Vector:new(v1.x + v2.x, v1.y + v2.y)
end

__add işlevinin nokta ile tanımlandığına dikkat et. Lua, her iki işleneni de sıradan argümanlar olarak iletir ve noktalı biçim her ikisini de adlandırır. İki nokta da kullanılabilir; çünkü function Vector:__add(other), function Vector.__add(self, other) ile aynıdır, ancak noktalı biçim gelenektir. __add, orijinal nesnelerden herhangi birini değiştirmek yerine yeni bir nesne döndürmelidir. Bu, işlemi öngörülebilir ve güvenli kılar.

local a = Vector:new(3, 4)
local b = Vector:new(1, 2)
local c = a + b

print(c.x, c.y)  -- Çıktı: 4  6

Temel fikir, __add öğesinin yalnızca nesnede değil, metatablonun kendisinde (burada Vector) bulunması gerektiğidir. Vector öğesini tüm örneklerin metatablosu olarak ayarladığımız için hepsi bu davranışı otomatik olarak paylaşır.

challenge icon

Görev

Kolay

+ işleçini kullanarak toplama işlemini destekleyen bir Vector sınıfı oluşturalım. Bu, işleç aşırı yüklemeye attığın ilk adım; nesnelerinin Lua'nın yerleşik işleçleriyle doğal biçimde çalışmasını sağlayacak.

Kodunu iki dosyaya ayıracaksın:

  • Vector.lua: x ve y bileşenlerine sahip Vector sınıfını tanımla. Bir :new(x, y) kurucusu ekle ve iki vektörün toplanmasının, bileşenlerinin toplamını içeren yeni bir vektör oluşturması için __add metamethod'unu uygula. Her iki işlenenin de adlandırılmış argümanlar olarak iletilmesi için __add'i nokta sözdizimiyle tanımla.
  • main.lua: Vector modülünü içe aktar, vektör örnekleri oluştur ve bunları toplamanın doğru sonucu verdiğini göster.

Dört girdi alacaksın:

  1. İlk vektörün x bileşeni
  2. İlk vektörün y bileşeni
  3. İkinci vektörün x bileşeni
  4. İkinci vektörün y bileşeni

Ana dosyanda, verilen bileşenlerle iki vektör oluştur, + işleçini kullanarak bunları topla ve sonuç vektörünün x ve y değerlerini ayrı satırlara yazdır.

Örneğin, girdiler 3, 4, 1, 2 ise çıktı şöyle olmalıdır:

4
6

İlk vektör (3, 4) ile ikinci vektörün (1, 2) toplamı yeni bir vektöre (4, 6) eşittir.

Kendin dene

-- Vector modülünü require ile yükle
local Vector = require('Vector')

-- Girdiyi oku
local x1 = tonumber(io.read())
local y1 = tonumber(io.read())
local x2 = tonumber(io.read())
local y2 = tonumber(io.read())

-- TODO: Girdi değerlerini kullanarak iki Vector örneği oluştur

-- TODO: İki vektörü + operatörünü kullanarak topla

-- TODO: Elde edilen vektörün x ve y değerlerini ayrı satırlara yazdır
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Lua derleyicisi