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 MBaş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 MSı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 MModü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)) -- 42Alt 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 MHı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
__indexaracılığıyla alt modülleri tembel olarak yükleyin- Uyumluluk denetimleri için
_VERSIONekleyin
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
- require İşlevi
- Bir Modül Dosyası Yazma
- package.path ve package.cpath
- Modül Örüntüleri ve En İyi Uygulamalar