Örnek Yöntemleri ve self
İki nokta söz dizimi ve örtük self parametresini kullanarak yöntemler tanımlayın.
Örnek Yöntemleri ve self, CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 3. 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.
self Örnektir
obj:method() çağrısı yaptığınızda Lua, obj değerini otomatik olarak ilk bağımsız değişken olarak geçirir. Geleneksel olarak bu parametreye self adı verilir. Yöntem, self üzerinden örnek verilerine erişir ve diğer yöntemleri çağırır.
local Counter = {}
Counter.__index = Counter
function Counter.new(start)
return setmetatable({value=start or 0, step=1}, Counter)
end
function Counter:increment()
self.value = self.value + self.step
end
function Counter:getValue() return self.value end
local c = Counter.new(10)
c:increment(); c:increment()
print(c:getValue()) -- 12Yöntem Zincirleme
Zincirlemeyi etkinleştirmek için yöntemlerden self döndürün: obj:method1():method2():method3(). Her çağrı aynı nesneyi döndürerek akıcı bir biçem sağlar. Bu, durumu değiştiren yöntemlerde en iyi şekilde çalışır.
local Builder = {}
Builder.__index = Builder
function Builder.new()
return setmetatable({parts={}},Builder)
end
function Builder:add(s) self.parts[#self.parts+1]=s; return self end
function Builder:addAll(t)
for _,v in ipairs(t) do self.parts[#self.parts+1]=v end
return self
end
function Builder:build() return table.concat(self.parts," ") end
local result = Builder.new()
:add("Hello")
:add("from")
:addAll({"Lua","OOP"})
:build()
print(result) -- Hello from Lua OOPDiğer Yöntemleri Çağırma
Yöntemler, self:otherMethod() aracılığıyla aynı örnekteki diğer yöntemleri çağırabilir. Bu, bir sınıf içindeki kodun yeniden kullanılmasını teşvik eder. Özel yardımcılar, self değerini açıkça alan sıradan yerel işlevler olabilir.
local Stack = {}
Stack.__index = Stack
function Stack.new() return setmetatable({_data={},_size=0},Stack) end
function Stack:push(v) self._size=self._size+1; self._data[self._size]=v end
function Stack:pop()
if self:isEmpty() then return nil end
local v=self._data[self._size]; self._data[self._size]=nil
self._size=self._size-1; return v
end
function Stack:peek()
return not self:isEmpty() and self._data[self._size] or nil
end
function Stack:isEmpty() return self._size==0 end
function Stack:size() return self._size end
local s=Stack.new(); s:push(1);s:push(2);s:push(3)
print(s:pop(),s:peek(),s:size()) -- 3 2 2Yöntem Geçersiz Kılma Uyarısı
Sınıf yöntemiyle aynı ada sahip bir örnek alanı ayarlamak, o örnek için yöntemi gizler. Bu genellikle bir hatadır — örnek alanı adlarının yöntem adlarıyla çakışabileceği durumlarda dikkatli olun.
local Dog = {}
Dog.__index = Dog
function Dog.new(n) return setmetatable({name=n},Dog) end
function Dog:speak() print(self.name..": Woof!") end
local d = Dog.new("Rex")
d:speak() -- Rex: Woof!
-- Accidental shadow:
d.speak = "loud" -- now d.speak is a string, not a function
local ok,err = pcall(function() d:speak() end)
print(ok, err) -- false attempt to call a string valueGeri Çağrılarda self
Bir yöntemi geri çağırma işlevi olarak geçirmek, örtük self değerini kaybettirir. self değerini yakalamak için yöntemi bir kapanışla sarın.
local Timer = {}
Timer.__index = Timer
function Timer.new(n) return setmetatable({count=n},Timer) end
function Timer:tick()
self.count=self.count-1
print("Ticking, count:", self.count)
end
local t = Timer.new(3)
-- Wrong: loses self
-- local cb = t.tick -- cb(t) works but cb() doesn't
-- Correct: closure captures self
local cb = function() t:tick() end
cb(); cb(); cb() -- Ticking 3 timesStatik ve Örnek Yöntemleri
Statik yöntem, bir örnek üzerinde değil, sınıf üzerinde çağrılır. self değeri yoktur (veya sınıfı self olarak alır). Lua'da biçimsel bir ayrım yoktur — geleneksel olarak statik yöntemlerde : yerine . kullanın.
local MathUtils = {}
MathUtils.__index = MathUtils
-- Static method (no instance needed)
function MathUtils.clamp(v, lo, hi)
return math.max(lo, math.min(hi, v))
end
-- Instance method (needs self)
function MathUtils:scale(factor)
self.value = self.value * factor
end
print(MathUtils.clamp(15, 0, 10)) -- 10
local m = setmetatable({value=5},MathUtils)
m:scale(3)
print(m.value) -- 15Karışım Yöntemleri
Biçimsel kalıtım olmadan bir karışım tablosundaki yöntemleri sınıfa ekleyin. Bu, düz bir bileşimdir: karışımın işlevlerini sınıf tablosuna kopyalayabilir veya orada onlara başvurabilirsiniz.
local Serializable = {}
function Serializable:serialize()
local parts={}
for k,v in pairs(self) do
if type(v)~="function" then
parts[#parts+1]=k.."="..tostring(v)
end
end
return "{"..table.concat(parts,",").."}"
end
local User = {}
User.__index = User
User.serialize = Serializable.serialize -- mixin!
function User.new(n,a) return setmetatable({name=n,age=a},User) end
local u = User.new("Alice",30)
print(u:serialize())Soyut Yöntemler
Lua soyut yöntemleri zorunlu kılmaz; ancak hata oluşturan bir temel sınıf yöntemi tanımlayarak alt sınıfları bunu geçersiz kılmaya zorlayabilirsiniz. Bu, "geçersiz kılınmalı" kuralı için kullanılan bir gelenektir.
local Shape = {}
Shape.__index = Shape
function Shape.new() return setmetatable({},Shape) end
function Shape:area()
error(type(self).." must implement area()",2)
end
function Shape:describe()
print("Shape area:", self:area())
end
local sq={}
setmetatable(sq,{__index=Shape})
function sq:area() return 4*4 end
sq:describe() -- Shape area: 16Yöntem Tabloları
Çok sayıda yönteme sahip sınıflarda bunları işlevlerine göre gruplar hâlinde düzenleyin. Aynı tablodaki tüm yöntemler aynı üst veri tablosu aramasını paylaşır; ancak bunları alt ad alanları kullanarak sorumluluklara göre bölebilirsiniz.
local Entity = {}
Entity.__index = Entity
Entity.Physics = {}
function Entity.Physics:applyForce(fx,fy)
self.vx=(self.vx or 0)+fx
self.vy=(self.vy or 0)+fy
end
Entity.Render = {}
function Entity.Render:draw()
print(string.format("Draw at (%g,%g)",self.x or 0,self.y or 0))
end
-- Mix into main class
for k,v in pairs(Entity.Physics) do Entity[k]=v end
for k,v in pairs(Entity.Render) do Entity[k]=v end
function Entity.new(x,y) return setmetatable({x=x,y=y},Entity) end
local e=Entity.new(10,20); e:draw(); e:applyForce(5,0); print(e.vx)Yetkilendirme ve Kalıtım
Derin kalıtım zincirleri yerine yetkilendirmeyi (bir başvuru tutmayı) tercih edin. Bir sınıf, başka bir nesneden kalıtım almak yerine işlemleri ona devredebilir; böylece bağımlılık azalır ve her sınıf kendi görevine odaklanır.
local Logger = {}
Logger.__index = Logger
function Logger.new(name) return setmetatable({name=name},Logger) end
function Logger:log(msg) print("["..self.name.."] "..msg) end
local Service = {}
Service.__index = Service
function Service.new(name)
return setmetatable({
name=name,
logger=Logger.new(name) -- delegation
},Service)
end
function Service:start()
self.logger:log("starting...") -- delegate logging
print(self.name, "running")
end
Service.new("AuthService"):start()Hızlı Kontrol
obj:method() ile obj.method() arasındaki fark nedir?
Özet: Örnek Yöntemleri
Özet:
- İki nokta üst üste çağrı söz dizimi:
obj:method()==obj.method(obj) - Yöntem zincirleme için self döndürün
- Diğer yöntemleri çağırın:
self:otherMethod() - Geri çağrılar: self değerini korumak için kapanışla sarın
- Statik yöntemler: geleneksel olarak nokta gösterimini kullanın
- Esneklik için derin kalıtım yerine yetkilendirme kullanın
Sıkça Sorulan Sorular
“Örnek Yöntemleri ve self” dersi ücretsiz mi?
Evet — “Örnek Yöntemleri ve self” 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.
“Örnek Yöntemleri ve self” dersinde ne öğreneceğim?
İki nokta söz dizimi ve örtük self parametresini kullanarak yöntemler tanımlayı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 3. dersidir.
“Örnek Yöntemleri ve self” 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