Menu
Coddy logo textTech

Nesneleri Toplama

Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 26 / 70.

__tostring ve __eq gibi metametotların nesnelerin nasıl davranacağını özelleştirmenize nasıl olanak tanıdığını zaten gördünüz. Şimdi bunu, toplama işleminden başlayarak aritmetik işlemlere genişleteceğiz.

__add metametodu, iki nesne arasında + operatörünü kullandığınızda ne olacağını tanımlar. Lua a + b ifadesini gördüğünde, her iki operandın metatablosunda __add metodunu arar.

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 fonksiyonunun iki nokta üst üste ile değil, nokta ile tanımlandığına dikkat edin. Her iki işleneni de argüman olarak alır ve orijinallerden herhangi birini değiştirmek yerine yeni bir nesne döndürmelidir. Bu, işlemi öngörülebilir ve güvenli tutar.

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

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

Buradaki kilit nokta, __add metodunun sadece nesnenin içinde değil, metatablonun kendisinde (burada Vector) bulunması gerektiğidir. Vector'ı tüm örnekler için metatablo olarak ayarladığımızdan, hepsi bu davranışı otomatik olarak paylaşır.

challenge icon

Görev

Kolay

+ operatörünü kullanarak toplama işlemini destekleyen bir Vector sınıfı oluşturalım. Bu, nesnelerinizin Lua'nın yerleşik operatörleriyle doğal bir şekilde çalışmasını sağlayan operatör aşırı yükleme (operator overloading) konusuna ilk adımınız olacak.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • Vector.lua: x ve y bileşenlerine sahip Vector sınıfınızı tanımlayın. Bir :new(x, y) yapıcı metodu (constructor) ekleyin ve iki vektörün toplanmasının bileşenleri birleştirilmiş yeni bir vektör oluşturması için __add metametodunu uygulayın. __add metodunun nokta sözdizimini (iki nokta üst üste değil) kullandığını ve her iki işleneni de argüman olarak aldığını unutmayın.
  • main.lua: Vector modülünüzü dahil edin (require), vektör örnekleri oluşturun ve bunları toplamanın doğru sonucu verdiğini gösterin.

Dört adet girdi alacaksınız:

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

Ana dosyanızda, verilen bileşenlerle iki vektör oluşturun, + operatörünü kullanarak bunları birbirine ekleyin ve sonuç vektörünün x ve y değerlerini ayrı satırlara yazdırın.

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

4
6

Birinci vektör (3, 4) artı ikinci vektör (1, 2), yeni bir vektör olan (4, 6) değerine eşittir.

Kopya kağıdı

__add metametodu, iki nesne arasında + operatörünü kullandığınızda ne olacağını tanımlar.

Lua a + b ifadesini gördüğünde, her iki operandın metatablosunda __add metodunu arar.

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 iki nokta (:) ile değil, nokta (.) ile tanımlanır. Her iki operandı da argüman olarak alır ve orijinallerini değiştirmek yerine yeni bir nesne döndürmelidir.

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

print(c.x, c.y)  -- Output: 4  6

__add sadece nesnenin içinde değil, metatablonun kendisinde bulunmalıdır.

Kendin dene

-- Vector modülünü dahil et
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())

-- YAPILACAK: Girdi değerlerini kullanarak iki Vector örneği oluşturun

-- YAPILACAK: + operatörünü kullanarak iki vektörü toplayın

-- YAPILACAK: Sonuç vektörünün x ve y değerlerini ayrı satırlara yazdırın
quiz iconKendini test et

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

Object Oriented Programming bölümündeki tüm dersler