Nokta vs İki Nokta
Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 4 / 70.
Hem nokta hem de iki nokta üst üste sözdizimini bildiğinize göre, her birini ne zaman kullanacağınızı ve bunları yanlış bir şekilde karıştırdığınızda ne olacağını anlamak kritik öneme sahiptir.
Temel kural basittir: bir fonksiyonu nasıl tanımladığınız, onu nasıl çağırdığınızla eşleşmelidir. Eğer iki nokta üst üste ile tanımlarsanız, iki nokta üst üste ile çağırın. Eğer nokta ve açık bir self ile tanımlarsanız, nokta ile çağırın ve tabloyu geçirin.
Onları yanlış eşleştirdiğinizde şunlar olur:
local game = { score = 0 }
function game:addPoints(points)
self.score = self.score + points
end
-- YANLIŞ: nokta ile çağrılıyor, ancak tablo geçirilmedi
game.addPoints(10) -- Hata! self artık tablo değil, 10'durgame.addPoints(10) çağırdığınızda, Lua game nesnesini otomatik olarak aktarmaz. 10 değeri self haline gelir ve bu da beklenmedik davranışlara veya hatalara yol açar.
Ters hata da sorunlara yol açar:
function game.reset(self)
self.score = 0
end
-- YANLIŞ: iki nokta ile çağırmak game'i iki kez iletir
game:reset() -- self game'i alır, ancak fazladan bir nil argümanı da beklenirBu özel durum işe yarayabilse de, kafa karışıklığına yol açar ve belirli argümanlar bekleyen fonksiyonların bozulmasına neden olabilir. En güvenli yaklaşım tutarlı kalmaktır: Fonksiyon self parametresine ihtiyaç duyduğunda hem tanımlama hem de çağırma için iki nokta üst üste kullanın, ihtiyaç duymadığında ise nokta kullanın.
Görev
Kolayscore alanı 0 olarak başlatılmış, player adında bir tablo oluşturun.
Tabloya iki fonksiyon ekleyin:
player.setScore(self, value)- nokta sözdizimi ve açıkselfparametresi ile tanımlanmış.self.scoredeğerini verilen değere ayarlar.player:addBonus(amount)- iki nokta sözdizimi ile tanımlanmış.self.scoredeğerineamountmiktarını ekler.
İki girdi alacaksınız:
- Bir başlangıç puanı değeri
- Eklenecek bir bonus miktarı
Aşağıdaki adımları gerçekleştirin:
- Başlangıç puanını ayarlamak için nokta sözdizimini kullanarak (tabloyu ilk argüman olarak geçirerek)
setScorefonksiyonunu çağırın - Bonusu eklemek için iki nokta sözdizimini kullanarak
addBonusfonksiyonunu çağırın player.scoredeğerinin son halini yazdırın
Unutmayın: her fonksiyonu nasıl tanımladıysanız o şekilde çağırın.
Kopya kağıdı
Lua'da metotları tanımlarken ve çağırırken, sözdizimi eşleşmelidir:
- Eğer iki nokta üst üste (
:) ile tanımlarsanız, iki nokta üst üste ile çağırın - Eğer nokta (
.) ve açık birselfile tanımlarsanız, nokta ile çağırın ve tabloyu geçirin
Hatalı kullanım - iki nokta ile tanımlandığında nokta ile çağırmak:
function game:addPoints(points)
self.score = self.score + points
end
game.addPoints(10) -- Error! self becomes 10, not the tableHatalı kullanım - nokta ile tanımlandığında iki nokta ile çağırmak:
function game.reset(self)
self.score = 0
end
game:reset() -- Confusing: passes game automatically but may cause issuesDoğru kullanım - eşleşen sözdizimi:
-- İki nokta ile tanımla, iki nokta ile çağır
function game:addPoints(points)
self.score = self.score + points
end
game:addPoints(10)
-- Nokta ile tanımla, nokta ile çağır
function game.reset(self)
self.score = 0
end
game.reset(game)Kendin dene
-- Girdiyi oku
local initialScore = tonumber(io.read())
local bonusAmount = tonumber(io.read())
-- TODO: Kodunuzu aşağıya yazın
-- 1. 0'a eşitlenmiş 'score' alanına sahip 'player' adında bir tablo oluşturun
-- 2. Açık 'self' parametresi içeren nokta sözdizimini kullanarak player.setScore(self, value) ekleyin
-- 3. İki nokta üst üste sözdizimini kullanarak player:addBonus(amount) ekleyin
-- 4. Nokta sözdizimini kullanarak setScore'u çağırın (tabloyu ilk argüman olarak geçirin)
-- 5. İki nokta üst üste sözdizimini kullanarak addBonus'u çağırın
-- Nihai puanı yazdır
print(player.score)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