0Pricing
Lua Academy · Ders

Bir Modül Dosyası Yazma

.lua dosyasından bir işlevler tablosu döndürerek modül oluşturun.

Bir Modül Dosyası Yazma, 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.

Temel Modül Deseni

Standart Lua modül deseni şöyledir: bir yerel M tablosu oluşturun, buna işlevler ve değerler ekleyin ve sonunda tabloyu döndürün. Bu tablo, modülün herkese açık API'sidir. Dosyadaki diğer tüm yerel değerler özeldir.

-- stringutils.lua
local M = {}

function M.trim(s)
  return s:match("^%s*(.-)%s*$")
end

function M.split(s, sep)
  local t = {}
  for p in s:gmatch("[^"..sep.."]+") do t[#t+1]=p end
  return t
end

return M

-- Usage:
-- local su = require("stringutils")
-- print(su.trim("  hello  "))

Özel Durum

Modül dosyasında local ile bildirilen değişkenler özeldir; çağıranlar bunlara erişemez. Modüldeki işlevler, yukarı değerler olarak özel duruma erişebilir. Bu, Lua'nın kapsülleme mekanizmasıdır.

-- counter.lua
local M = {}
local count = 0   -- private state

function M.increment(n)
  count = count + (n or 1)
end

function M.reset()
  count = 0
end

function M.get()
  return count
end

return M

Başlatma İçeren Modül

Bazı modüllerin başlatılması gerekir (yapılandırma, bağlantılar). Başlatma kodunu modül düzeyine (dosyanın en üstüne) veya açıkça çağrılan bir M.init() işlevine yerleştirin. Modül düzeyindeki yaklaşım, ilk kez gerektirildiğinde bir kez çalışır; init() ise açıkça çağrılmalıdır.

-- cache.lua
local M = {}
local store = {}   -- initialized at load time
local hits = 0
local misses = 0

function M.get(key)
  if store[key] ~= nil then
    hits = hits + 1
    return store[key]
  end
  misses = misses + 1
  return nil
end

function M.set(key, val) store[key] = val end
function M.stats() return {hits=hits, misses=misses} end

return M

Sınıf İçeren Modül

Bir modül, oluşturucu işlev içeren bir tablo olarak bir sınıf dışa aktarabilir. Döndürülen modül tablosu new() işlevini içerir ve sınıfın üst veriler tablosu olarak da kullanılabilir.

-- point.lua
local Point = {}
Point.__index = Point

function Point.new(x, y)
  return setmetatable({x=x, y=y}, Point)
end

function Point:distance(other)
  local dx, dy = self.x-other.x, self.y-other.y
  return math.sqrt(dx*dx + dy*dy)
end

function Point:__tostring()
  return string.format("(%g,%g)", self.x, self.y)
end

return Point

-- Usage:
-- local Point = require("point")
-- local p = Point.new(3, 4)

Modül Sabitleri

Sabitleri modül tablosuna ekleyerek dışa aktarın. Geleneksel olarak sabitler büyük harfle yazılır. Lua'da const olmadığı için kullanıcılar bunları teknik olarak değiştirebilir; ancak büyük harfli adlandırma, "değiştirmeyin" anlamı taşır.

-- colors.lua
local M = {}

M.RED   = {r=255, g=0,   b=0}
M.GREEN = {r=0,   g=255, b=0}
M.BLUE  = {r=0,   g=0,   b=255}
M.WHITE = {r=255, g=255, b=255}
M.BLACK = {r=0,   g=0,   b=0}

function M.toHex(c)
  return string.format("#%02X%02X%02X", c.r, c.g, c.b)
end

return M

Modül Sürümleme

Modülünüze bir sürüm alanı ekleyin. Çağıranlar, uyumluluğu doğrulamak için sürümü denetleyebilir. Anlamsal sürümleme kullanın (major.minor.patch).

-- mylib.lua
local M = {}
M._VERSION = "1.2.3"
M._NAME = "mylib"
M._DESCRIPTION = "My Lua library"

function M.hello(name)
  return "Hello, " .. (name or "World") .. "!"
end

return M

-- Usage:
local mylib = require("mylib")
print(mylib._VERSION)   -- 1.2.3
print(mylib.hello("Lua"))

Alt Modüller

Büyük kitaplıklar alt modüllere ayrılır. Ana modül, alt modülleri gerektirip yeniden dışa aktarabilir veya her alt modül bağımsız olarak kullanılabilir. Dosyaları, modül yoluyla eşleşen dizinlerde düzenleyin.

-- mylib/init.lua  (loaded by require("mylib"))
local M = {}

M.strings = require("mylib.strings")
M.tables  = require("mylib.tables")
M.math    = require("mylib.math")

M._VERSION = "2.0.0"

return M

-- Users can require the whole library:
-- local mylib = require("mylib")
-- mylib.strings.trim(...)

-- Or individual sub-modules:
-- local strs = require("mylib.strings")

Üst Veriler Tablosu İçeren Modül

Modüle __call içeren bir üst veriler tablosu vererek modülü çağrılabilir hâle getirin. Bu, ağırlıklı olarak işlevlerden oluşan ancak yardımcı araçları da bulunan modüller için kullanışlıdır; "ana" işlem çağrıdır, yardımcı araçlar ise alanlardır.

-- format.lua
local M = {}
setmetatable(M, {__call = function(_, fmt, ...)
  return string.format(fmt, ...)
end})

function M.pad(s, width, char)
  char = char or " "
  return string.rep(char, math.max(0, width - #s)) .. s
end

return M

-- Usage:
-- local fmt = require("format")
-- print(fmt("%.2f", 3.14))   -- 3.14
-- print(fmt.pad("42", 5))    --    42

Alt Modülleri Tembel Yükleme

Alt modülleri tembel olarak, yani yalnızca ilk erişildiklerinde yüklemek için __index kullanın. Bu, çok sayıda alt modül içeren büyük kitaplıkların başlatılmasını hızlandırır.

-- biglib.lua
local M = {}
local submodules = {"strings", "tables", "math", "io"}

setmetatable(M, {
  __index = function(t, k)
    for _, name in ipairs(submodules) do
      if name == k then
        local mod = require("biglib." .. k)
        rawset(t, k, mod)
        return mod
      end
    end
    return nil
  end
})

return M

-- Loads biglib.strings only when accessed:
-- local lib = require("biglib")
-- lib.strings.trim(...)

Modül Testi Deseni

Modül dosyasının altına, yalnızca dosya doğrudan çalıştırıldığında (gerektirilmediğinde) koşullu olarak yürütülen bir test işlevi veya bloğu ekleyin. Böylece birim testleri kodla aynı yerde tutulur.

-- utils.lua
local M = {}

function M.clamp(v, lo, hi)
  return math.max(lo, math.min(hi, v))
end

-- Self-test: only runs when executed directly
if debug.getinfo(2, "S") == nil then
  -- Running as main script, not required
  print("Testing clamp...")
  assert(M.clamp(5, 0, 10) == 5)
  assert(M.clamp(-1, 0, 10) == 0)
  assert(M.clamp(15, 0, 10) == 10)
  print("All tests passed!")
end

return M

Hızlı Kontrol

Lua modülünde özel durumu tanımlamanın standart yolu nedir?

Özet: Modül Yazma

Özet:

  • Desen: local M = {} ... return M
  • Dosyadaki yerel değerler = özel; M alanları = herkese açık API
  • Modül düzeyindeki kod, ilk require sırasında bir kez çalışır
  • Sınıfları, modül tablosundaki oluşturucu aracılığıyla dışa aktarın
  • __index aracılığıyla alt modülleri tembel olarak yükleyin
  • Uyumluluk denetimleri için _VERSION ekleyin

Sıkça Sorulan Sorular

“Bir Modül Dosyası Yazma” dersi ücretsiz mi?

Evet — “Bir Modül Dosyası Yazma” 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.

“Bir Modül Dosyası Yazma” dersinde ne öğreneceğim?

.lua dosyasından bir işlevler tablosu döndürerek modül oluşturun. 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.

“Bir Modül Dosyası Yazma” 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. require İşlevi
  2. Bir Modül Dosyası Yazma
  3. package.path ve package.cpath
  4. Modül Örüntüleri ve En İyi Uygulamalar
← Lua Academy Sayfasına Dön