Menu
Coddy logo textTech

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'dur

game.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 beklenir

Bu ö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.

challenge icon

Görev

Kolay

score alanı 0 olarak başlatılmış, player adında bir tablo oluşturun.

Tabloya iki fonksiyon ekleyin:

  1. player.setScore(self, value) - nokta sözdizimi ve açık self parametresi ile tanımlanmış. self.score değerini verilen değere ayarlar.
  2. player:addBonus(amount) - iki nokta sözdizimi ile tanımlanmış. self.score değerine amount miktarını ekler.

İki girdi alacaksınız:

  1. Bir başlangıç puanı değeri
  2. Eklenecek bir bonus miktarı

Aşağıdaki adımları gerçekleştirin:

  1. Başlangıç puanını ayarlamak için nokta sözdizimini kullanarak (tabloyu ilk argüman olarak geçirerek) setScore fonksiyonunu çağırın
  2. Bonusu eklemek için iki nokta sözdizimini kullanarak addBonus fonksiyonunu çağırın
  3. player.score değ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 bir self ile 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 table

Hatalı 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 issues

Doğ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)
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