0Pricing
Lua Academy · Ders

Ö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())  -- 12

Yö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 OOP

Diğ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  2

Yö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 value

Geri Ç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 times

Statik 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)  -- 15

Karışı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: 16

Yö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

  1. Üst Tablolarla Sınıflar
  2. Oluşturucular ve new()
  3. Örnek Yöntemleri ve self
  4. Kapanışlarla Kapsülleme
← Lua Academy Sayfasına Dön