Oluşturucular ve new()
Örnekleri oluşturan ve başlatan oluşturucu işlevler yazın.
Oluşturucular ve new(), CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Lua Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Lua Academy kursu toplamda 4 dersten oluşur.
Yapıcının Sorumluluğu
Bir yapıcı, bir örnek oluşturur ve başlatır. Başlangıç değerlerini alır, bunları doğrular, eksik alanlar için varsayılan değerleri ayarlar ve yeni örneği döndürür. İyi tasarlanmış bir yapıcı, her örneğin geçerli bir durumda başlamasını sağlar.
local Player = {}
Player.__index = Player
function Player.new(name, hp, mp)
assert(type(name)=="string" and name~="","need name")
return setmetatable({
name = name,
hp = hp or 100,
mp = mp or 50,
alive = true,
items = {},
}, Player)
end
local p = Player.new("Hero")
print(p.name, p.hp, p.mp) -- Hero 100 50Akıcı Yapıcı
Akıcı bir yapıcı, ayarlayıcı yöntemlerden self döndürerek oluşturma sırasında yöntem zincirlemesini mümkün kılar. Bu, Lua'daki bir oluşturucu kalıbıdır.
local Config = {}
Config.__index = Config
function Config.new()
return setmetatable({_data={}}, Config)
end
function Config:set(k,v) self._data[k]=v; return self end
function Config:build() return self._data end
local cfg = Config.new()
:set("host","localhost")
:set("port",8080)
:set("debug",true)
:build()
print(cfg.host, cfg.port)Kopya Yapıcı
Bir kopya yapıcı, mevcut bir örnekle aynı değerlere sahip yeni bir örnek oluşturur. Önemli: İç içe tabloların paylaşılması mı yoksa bağımsız olması mı gerektiğine bağlı olarak sığ veya derin kopya kullanın.
local function deepCopy(orig)
if type(orig)~="table" then return orig end
local copy = {}
for k,v in pairs(orig) do copy[deepCopy(k)]=deepCopy(v) end
return setmetatable(copy, getmetatable(orig))
end
local Item = {}
Item.__index = Item
function Item.new(name, stats)
return setmetatable({name=name, stats=stats or {}}, Item)
end
function Item:clone()
return deepCopy(self)
end
local sword = Item.new("Sword",{damage=50})
local clone = sword:clone()
clone.stats.damage = 30
print(sword.stats.damage) -- 50 (unchanged)Doğrulamalı Yapıcı
Yapıcı girdilerini her zaman doğrulayın. 2. düzeyde (çağıranı sorumlu tutarak) geçersiz girdiler için açıklayıcı hatalar oluşturun. Bu, hataları erkenden yakalar ve yararlı hata iletileri üretir.
local Rectangle = {}
Rectangle.__index = Rectangle
function Rectangle.new(w, h)
assert(type(w)=="number" and w>0,"width must be positive number")
assert(type(h)=="number" and h>0,"height must be positive number")
return setmetatable({width=w, height=h}, Rectangle)
end
function Rectangle:area() return self.width * self.height end
function Rectangle:perimeter() return 2*(self.width+self.height) end
local r = Rectangle.new(5, 3)
print(r:area(), r:perimeter()) -- 15 16Varsayılan Değerler Kalıbı
İsteğe bağlı yapıcı parametrelerini temiz bir şekilde işlemek için bir varsayılanlar tablosu kullanın. Bu, uzun x = x or default zincirlerini önler ve varsayılanları açıkça görünür ve kolayca değiştirilebilir hâle getirir.
local Sprite = {}
Sprite.__index = Sprite
local DEFAULTS = {x=0,y=0,rotation=0,scale=1,visible=true,alpha=1}
function Sprite.new(image, opts)
local cfg = opts or {}
local self = {image=image}
for k,v in pairs(DEFAULTS) do
self[k] = cfg[k] ~= nil and cfg[k] or v
end
return setmetatable(self, Sprite)
end
local s = Sprite.new("hero.png",{x=100,y=200})
print(s.x,s.y,s.scale) -- 100 200 1Statik Fabrika Yöntemleri
Bir sınıf, farklı oluşturma senaryoları için birden çok fabrika yöntemine sahip olabilir. Bu, tek bir yapıcıyı birçok isteğe bağlı parametreyle aşırı yüklemekten daha temizdir.
local Color = {}
Color.__index = Color
function Color.fromRGB(r,g,b)
return setmetatable({r=r,g=g,b=b}, Color)
end
function Color.fromHex(hex)
hex = hex:gsub("#","")
return setmetatable({
r=tonumber(hex:sub(1,2),16),
g=tonumber(hex:sub(3,4),16),
b=tonumber(hex:sub(5,6),16),
}, Color)
end
function Color:toHex()
return string.format("#%02X%02X%02X",self.r,self.g,self.b)
end
local red = Color.fromHex("#FF0000")
print(red:toHex()) -- #FF0000Yapıcı Kayıt Defteri
Tüm örnekleri izlemek için bir kayıt defteri kullanın. Bu, "tümünü yok etme" veya bir türdeki tüm nesneler üzerinde yineleme yapma gibi genel işlemlere olanak tanır.
local Enemy = {}
Enemy.__index = Enemy
Enemy._all = {}
function Enemy.new(name, hp)
local self = setmetatable({name=name, hp=hp}, Enemy)
Enemy._all[#Enemy._all+1] = self
return self
end
function Enemy.destroyAll()
for _, e in ipairs(Enemy._all) do
print("Destroying:", e.name)
end
Enemy._all = {}
end
Enemy.new("Goblin",30)
Enemy.new("Orc",80)
print("Count:", #Enemy._all) -- 2
Enemy.destroyAll()Tembel Başlatma
Bazı alanların hesaplanması maliyetlidir. Bunları ilk erişimde hesaplayıp önbelleğe almak için __index işlevini kullanın.
local BigData = {}
BigData.__index = function(t, k)
if k == "processed" then
print("Computing processed...")
local result = {}
for i,v in ipairs(rawget(t,"raw")) do result[i]=v*2 end
rawset(t,"processed",result)
return result
end
end
function BigData.new(raw)
return setmetatable({raw=raw}, BigData)
end
local d = BigData.new({1,2,3,4,5})
print(d.processed[3]) -- Computing... 6
print(d.processed[3]) -- 6 (cached, no recompute)Örnekten Prototip
Aynı temel değerlere sahip başka bir örnek oluşturmak için bir örneği klonlayın. Klon, aynı üst veri tablosunu (aynı sınıfı) ve örnek verilerinin bir kopyasını alır. "Şablon" nesneler için kullanışlıdır.
local Unit = {}
Unit.__index = Unit
function Unit.new(t)
return setmetatable({name=t.name,hp=t.hp,atk=t.atk}, Unit)
end
function Unit:clone()
return Unit.new({name=self.name,hp=self.hp,atk=self.atk})
end
function Unit:__tostring()
return self.name.."(HP:"..self.hp..",ATK:"..self.atk..")"
end
local template = Unit.new({name="Soldier",hp=100,atk=10})
local u1 = template:clone(); u1.name="Alpha"
local u2 = template:clone(); u2.name="Beta"
print(tostring(u1),tostring(u2))Yapıcı Hatalarına Karşı Güvenlik
Oluşturma işlemi yarıda başarısız olursa (ör. kaynak ayırma sırasında), kısmen oluşturulmuş nesnelerin dışarı sızmadığından emin olun. Oluşturma hatalarını yakalamak ve gerekirse kaynakları temizlemek için pcall kullanın.
local FileHandle = {}
FileHandle.__index = FileHandle
function FileHandle.new(path, mode)
local f, err = io.open(path, mode or "r")
if not f then
return nil, "cannot open " .. path .. ": " .. err
end
return setmetatable({_f=f, path=path}, FileHandle)
end
function FileHandle:read(fmt) return self._f:read(fmt) end
function FileHandle:close() self._f:close() end
local fh, err = FileHandle.new("data.txt")
if not fh then print("Error:", err)
else print(fh:read("l")); fh:close()
endHızlı Kontrol
Lua OOP'de bir yapıcının (new()) rolü nedir?
Özet: Yapıcılar
Özet:
- Yapıcı doğrulama ve başlatma işlemlerini yapar ve setmetatable'ı çağırır
- Temiz isteğe bağlı parametreler için varsayılanlar tablosu kullanın
- Farklı oluşturma senaryoları için birden çok fabrika yöntemi kullanın
- Şablon nesneler için klon yapıcı kullanın
- Maliyeti yüksek alanlar için __index aracılığıyla tembel başlatma kullanın
- Başarısızlık durumunda (kaynak ayırma) yapıcıdan nil+err döndürün
Sıkça Sorulan Sorular
“Oluşturucular ve new()” dersi ücretsiz mi?
Evet — “Oluşturucular ve new()” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Lua Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Lua Academy kursu toplamda 4 dersten oluşur.
“Oluşturucular ve new()” dersinde ne öğreneceğim?
Örnekleri oluşturan ve başlatan oluşturucu işlevler yazın. Lua Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Lua Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Lua Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Oluşturucular ve new()” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Lua Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Lua Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Üst Tablolarla Sınıflar
- Oluşturucular ve new()
- Örnek Yöntemleri ve self
- Kapanışlarla Kapsülleme