Menu
Coddy logo textTech

Açık 'self'

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

Bir fonksiyon bir tablonun içinde yer aldığında, genellikle aynı tablo içindeki verilere erişmesi veya bu verileri değiştirmesi gerekir. Ancak sorun şudur: fonksiyon hangi tabloya ait olduğunu nasıl bilir?

Çözüm, tabloyu fonksiyona ilk argüman olarak açıkça iletmektir. Teamül gereği, bu parametre self olarak adlandırılır:

local counter = {
    value = 0
}

function counter.increment(self)
    self.value = self.value + 1
end

counter.increment(counter)
print(counter.value)  -- Çıktı: 1

Tablonun kendisini argüman olarak geçirerek counter.increment(counter) fonksiyonunu nasıl çağırdığımıza dikkat edin. Fonksiyonun içinde, self artık o tabloyu ifade eder ve bu da self.value değerini okumamıza ve değiştirmemize olanak tanır.

Bu desen önemlidir çünkü fonksiyonun, tablo adını sabit kodlamadan tablonun verileriyle çalışmasına olanak tanır. Mevcut sayımı sıfırlayan ve döndüren bir fonksiyonu düşünün:

function counter.reset(self)
    local old = self.value
    self.value = 0
    return old
end

print(counter.reset(counter))  -- Çıktı: 1
print(counter.value)           -- Çıktı: 0

Tabloyu manuel olarak geçirmek işe yarasa da, bu durum tekrarlayıcı gelebilir. Bir sonraki derste, bunu otomatik olarak halleden daha temiz bir sözdizimi öğreneceksiniz.

challenge icon

Görev

Kolay

count alanı 0 olarak başlatılmış tracker adında bir tablo oluşturun.

Aşağıdaki özelliklere sahip bir tracker.addAmount(self, amount) fonksiyonu ekleyin:

  • İlk parametre olarak self (tabloyu) kabul eder
  • İkinci parametre olarak amount değerini kabul eder
  • amount değerini self.count alanına ekler

İki girdi alacaksınız:

  1. Eklenecek ilk miktar
  2. Eklenecek ikinci miktar

tracker.addAmount fonksiyonunu her seferinde tabloyu ilk argüman olarak geçirerek iki kez (her girdi için bir kez) çağırın. Her iki çağrıdan sonra, tracker.count değerinin son halini yazdırın.

Kopya kağıdı

Tabloların içindeki fonksiyonlar, geleneksel olarak self olarak adlandırılan ilk parametre olarak tabloyu alarak tablo verilerine erişebilirler:

local counter = {
    value = 0
}

function counter.increment(self)
    self.value = self.value + 1
end

counter.increment(counter)  -- Tabloyu argüman olarak geçir
print(counter.value)  -- Output: 1

self parametresi, fonksiyonun tablo adını sabit kodlamadan (hardcoding) tablonun alanlarını okumasına ve değiştirmesine olanak tanır:

function counter.reset(self)
    local old = self.value
    self.value = 0
    return old
end

print(counter.reset(counter))  -- Output: 1
print(counter.value)           -- Output: 0

Fonksiyonlar, self parametresinden sonra ek parametreler kabul edebilirler:

function counter.add(self, amount)
    self.value = self.value + amount
end

counter.add(counter, 5)

Kendin dene

-- Girdiyi oku
local amount1 = tonumber(io.read())
local amount2 = tonumber(io.read())

-- YAPILACAK: Kodunuzu aşağıya yazın
-- 'count' alanı 0 olarak başlatılmış 'tracker' adında bir tablo oluşturun
-- self.count'a miktar ekleyen bir tracker.addAmount(self, amount) fonksiyonu ekleyin
-- Tabloyu ilk argüman olarak kullanarak tracker.addAmount fonksiyonunu iki kez çağırın


-- Nihai sayımı yazdırın
print(tracker.count)
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