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ı: 1Tablonun 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ı: 0Tabloyu 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.
Görev
Kolaycount 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
amountdeğerini kabul eder amountdeğeriniself.countalanına ekler
İki girdi alacaksınız:
- Eklenecek ilk miktar
- 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: 1self 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: 0Fonksiyonlar, 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)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
1'Self' Kavramı
Fonksiyonlu TablolarAçık 'self'İki Nokta SözdizimiNokta vs İki NoktaÖzet - Hareket Eden Nokta4Proje: Dijital Banka
Proje KurulumuPara Yatırma Metodu7Çok Biçimlilik ve Geçersiz Kılma
Metotları Geçersiz KılmaÜst Sınıf Metotlarını ÇağırmaDuck TypingOrtak ArayüzTür KontrolüÖzet - Çalışan Rolleri2Sınıf Prototip Kalıbı
Prototip Kavramı__index ile Bağlama:new() KurucusuÖznitelikleri BaşlatmaBağımsız ÖrneklerÖzet - Araba Fabrikası5OOP'de Operatör Aşırı Yükleme
Nesneleri ToplamaNesneleri ÇıkarmaNesneleri BirleştirmeNesneleri Karşılaştırma (<, >)Özet - Cüzdan Matematiği8Kapsülleme
Adlandırma KurallarıGizlilik için Closure'larClosure'lar Aracılığıyla ErişimSalt Okunur TablolarDoğrulama MantığıÖzet - Güvenli Kasa11Tasarım Kalıpları (Lite)
Fabrika FonksiyonlarıSingleton TablosuIterator KalıbıObserver (Dinleyici)Özet - Logger Fabrikası3Nesne Durumu ve Davranışı
Örnek DeğişkenleriGetter MetotlarıSetter MetotlarıHesaplanmış ÖzelliklerString BiçimlendirmeEşitlik KontrolleriÖzet - Öğrenci Notu6Kalıtımın Temelleri
Kalıtım KurulumuMetot KalıtımıConstructor'ı GenişletmeAlt Sınıf Metotları EklemePaylaşılan ve BenzersizÖzet - Şekil Hiyerarşisi