Lua Academy · पाठ

मॉड्यूल फ़ाइल लिखना

.lua फ़ाइल से फ़ंक्शनों की टेबल लौटाकर मॉड्यूल बनाएँ।

पाठ 2, कुल 4 में से12 चरण

मॉड्यूल फ़ाइल लिखना, CoddyKit पर Lua Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Lua Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Lua Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

मूल मॉड्यूल पैटर्न

मानक Lua मॉड्यूल पैटर्न यह है: एक स्थानीय तालिका M बनाएँ, उसमें फ़ंक्शन और मान जोड़ें, और अंत में उसे लौटाएँ। यह तालिका मॉड्यूल का सार्वजनिक API होती है। फ़ाइल के अन्य सभी स्थानीय मान निजी होते हैं।

-- 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  "))

निजी स्थिति

मॉड्यूल फ़ाइल में local के रूप में घोषित चर निजी होते हैं — कॉल करने वाले उन तक पहुँच नहीं सकते। मॉड्यूल के फ़ंक्शन अपवैल्यू के रूप में निजी स्थिति तक पहुँच सकते हैं। यही Lua की एनकैप्सुलेशन व्यवस्था है।

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

आरंभीकरण वाला मॉड्यूल

कुछ मॉड्यूल को आरंभीकरण की आवश्यकता होती है (कॉन्फ़िगरेशन, कनेक्शन)। आरंभीकरण कोड मॉड्यूल स्तर पर (फ़ाइल के आरंभ में) या स्पष्ट M.init() फ़ंक्शन में रखें। मॉड्यूल-स्तरीय तरीका पहली बार require किए जाने पर एक बार चलता है; init() के लिए स्पष्ट रूप से कॉल करना आवश्यक है।

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

क्लास वाला मॉड्यूल

कोई मॉड्यूल एक क्लास निर्यात कर सकता है: ऐसी तालिका जिसमें कंस्ट्रक्टर फ़ंक्शन हो। लौटाई गई मॉड्यूल तालिका में new() फ़ंक्शन होता है और वह क्लास मेटाटेबल के रूप में भी काम कर सकती है।

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

मॉड्यूल स्थिरांक

स्थिरांकों को मॉड्यूल तालिका में जोड़कर निर्यात करें। परंपरा के अनुसार, स्थिरांकों के नाम बड़े अक्षरों में लिखे जाते हैं। Lua में const नहीं है, इसलिए उपयोगकर्ता तकनीकी रूप से उन्हें बदल सकते हैं, लेकिन बड़े अक्षरों वाला नाम यह संकेत देता है कि उन्हें "न बदलें"।

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

मॉड्यूल संस्करण निर्धारण

अपने मॉड्यूल में एक संस्करण फ़ील्ड शामिल करें। कॉल करने वाले संगतता सुनिश्चित करने के लिए संस्करण की जाँच कर सकते हैं। सिमैंटिक संस्करण निर्धारण (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"))

उप-मॉड्यूल

बड़ी लाइब्रेरी को उप-मॉड्यूल में बाँटा जाता है। मुख्य मॉड्यूल उप-मॉड्यूल को require करके फिर से निर्यात कर सकता है, या प्रत्येक उप-मॉड्यूल का स्वतंत्र रूप से उपयोग किया जा सकता है। फ़ाइलों को मॉड्यूल पथ से मेल खाती निर्देशिकाओं में व्यवस्थित करें।

-- 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")

मेटाटेबल वाला मॉड्यूल

__call वाली मेटाटेबल देकर मॉड्यूल को कॉल करने योग्य बनाएँ। यह उन मॉड्यूल के लिए उपयोगी है जो मुख्य रूप से फ़ंक्शन होते हैं, लेकिन उनमें उपयोगिताएँ भी होती हैं — "मुख्य" कार्य कॉल होता है और उपयोगिताएँ फ़ील्ड होती हैं।

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

उप-मॉड्यूल का विलंबित लोडिंग

उप-मॉड्यूल को विलंब से लोड करने के लिए __index का उपयोग करें — केवल पहली बार पहुँचने पर। कई उप-मॉड्यूल वाली बड़ी लाइब्रेरी के लिए इससे आरंभ होने की गति बढ़ती है।

-- 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(...)

मॉड्यूल परीक्षण पैटर्न

मॉड्यूल फ़ाइल के अंत में कोई परीक्षण फ़ंक्शन या ब्लॉक जोड़ें, जिसे केवल तब सशर्त रूप से चलाया जाए जब फ़ाइल सीधे चलाई जाए (require न की जाए)। इससे इकाई परीक्षण कोड के साथ ही स्थित रहते हैं।

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

त्वरित जाँच

Lua मॉड्यूल में निजी स्थिति परिभाषित करने का मानक तरीका क्या है?

पुनरावलोकन: मॉड्यूल लिखना

सारांश:

  • पैटर्न: local M = {} ... return M
  • फ़ाइल के स्थानीय मान = निजी; M फ़ील्ड = सार्वजनिक API
  • मॉड्यूल-स्तरीय कोड पहली बार require करने पर एक बार चलता है
  • मॉड्यूल तालिका में कंस्ट्रक्टर के माध्यम से क्लास निर्यात करें
  • __index के माध्यम से उप-मॉड्यूल का विलंबित लोडिंग
  • संगतता जाँच के लिए _VERSION शामिल करें
शुरुआत निःशुल्क

एआई शिक्षक के साथ Lua सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
40
पाठ
159

अक्सर पूछे जाने वाले प्रश्न

क्या “मॉड्यूल फ़ाइल लिखना” पाठ निःशुल्क है?

हाँ — Lua Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “मॉड्यूल फ़ाइल लिखना” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Lua Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“मॉड्यूल फ़ाइल लिखना” में मैं क्या सीखूँगा?

.lua फ़ाइल से फ़ंक्शनों की टेबल लौटाकर मॉड्यूल बनाएँ। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Lua Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Lua Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Lua Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।

“मॉड्यूल फ़ाइल लिखना” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Lua Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Lua Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. require फ़ंक्शन
  2. मॉड्यूल फ़ाइल लिखना
  3. package.path और package.cpath
  4. मॉड्यूल पैटर्न और सर्वोत्तम अभ्यास
← Lua Academy पर वापस जाएँ