Menu
Coddy logo textTech

__index ile Bağlama

Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 7 / 70.

Özellikleri ve metotları olan bir prototip tablonuz var, ancak yeni bir nesnenin bunu gerçekten kullanmasını nasıl sağlarsınız? Cevap __index metametodunda yatmaktadır.

Bir tabloda var olmayan bir anahtara eriştiğinizde, Lua normalde nil döndürür. Ancak, tablonun __index alanına sahip bir metatablosu varsa, Lua bunun yerine oraya bakacaktır. __index alanını prototipinize işaret edecek şekilde ayarlayarak, eksik olan tüm anahtarlar otomatik olarak prototipte bulunur:

local Dog = {
    species = "Canis familiaris",
    legs = 4
}

function Dog:bark()
    print("Woof!")
end

-- Boş bir örnek oluşturun
local myDog = {}

-- Onu prototipe bağlayın
setmetatable(myDog, { __index = Dog })

print(myDog.species)  -- Çıktı: Canis familiaris
myDog:bark()          -- Çıktı: Woof!

myDog tablosu tamamen boştur, ancak myDog.species erişimi çalışır. Lua, myDog içinde species bulamadığında, metatablo'nun __index kısmını kontrol eder ve onu Dog içinde bulur.

Bu, Lua’da nesne yönelimli programlamanın temelidir. Örnek kendi benzersiz verilerine sahip olabilirken paylaşılan davranış prototipte bulunur. Bir sonraki derste, bu kalıbı temiz bir kurucu işlevinde nasıl kapsülleyeceğini öğreneceksin.

challenge icon

Görev

Kolay

Şimdi __index metamethod'unu uygulamaya koyalım! Bir prototip oluşturacak ve bir örneği ona bağlayacaksın; böylece örnek, doğrudan sahip olmadığı özelliklere ve metotlara erişebilecek.

Kodunu iki dosyaya ayıracaksın:

  • Robot.lua: Şunları içeren bir Robot prototip tablosu tanımla:
    • model alanını "RX-100" olarak ayarla
    • batteryLevel alanını 100 olarak ayarla
    • Robotun mevcut durumunu yazdıran bir :status() metodu ekle
    Dosyanın sonunda tabloyu döndür.
  • main.lua: Robot modülünü gerektir, ardından bir boş örnek tablosu oluştur ve setmetatable ile birlikte __index kullanarak onu Robot prototipine bağla. Bu, boş örneğinin prototipteki her şeye erişmesini sağlar.

Tek bir girdi alacaksın: robot örneğine atanacak bir ad.

Örneği prototipe bağladıktan sonra:

  1. Girdi olarak alınan adı örneğinin name alanına ata (bu alan örneğe özgü olur)
  2. Örneğin üzerinde :status() metodunu çağır

:status() metodun tam olarak şu biçimde yazdırmalıdır:

[name] ([model]) - Battery: [batteryLevel]%

Örneğin, girdi Sparky ise çıktı şöyle olmalıdır:

Sparky (RX-100) - Battery: 100%

Örneğin kendine ait bir name alanı olduğunu, ancak model bağlantısı aracılığıyla batteryLevel ve __index alanlarına prototipten eriştiğini fark et.

Kendin dene

-- Girdiyi oku
local name = io.read()

-- Robot modülünü dahil et
local Robot = require('Robot')

-- YAPILACAK: Boş bir örnek (instance) tablosu oluşturun

-- YAPILACAK: __index ile setmetatable kullanarak örneği Robot prototipine bağlayın

-- YAPILACAK: Girdi ismini örneğinizin name alanına atayın

-- YAPILACAK: Örneğiniz üzerinde :status() metodunu çağı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.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Lua derleyicisi