Lua Academy · पाठ

कंस्ट्रक्टर और new()

ऐसे कंस्ट्रक्टर फ़ंक्शन लिखें जो इंस्टेंस बनाएँ और उन्हें आरंभ करें।

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

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

कंस्ट्रक्टर की ज़िम्मेदारी

कंस्ट्रक्टर एक इंस्टेंस बनाता और उसे प्रारंभ करता है। यह शुरुआती मान प्राप्त करता है, उनकी मान्यता जाँचता है, अनुपस्थित फ़ील्ड के लिए डिफ़ॉल्ट मान सेट करता है और नया इंस्टेंस लौटाता है। अच्छी तरह डिज़ाइन किया गया कंस्ट्रक्टर सुनिश्चित करता है कि हर इंस्टेंस मान्य स्थिति में शुरू हो।

local Player = {}
Player.__index = Player

function Player.new(name, hp, mp)
  assert(type(name)=="string" and name~="","need name")
  return setmetatable({
    name = name,
    hp   = hp or 100,
    mp   = mp or 50,
    alive = true,
    items = {},
  }, Player)
end

local p = Player.new("Hero")
print(p.name, p.hp, p.mp)  -- Hero  100  50

फ्लुएंट कंस्ट्रक्टर

फ्लुएंट कंस्ट्रक्टर सेटर विधियों से self लौटाता है, जिससे निर्माण के दौरान विधियों को श्रृंखलाबद्ध किया जा सकता है। Lua में यह बिल्डर पैटर्न है।

local Config = {}
Config.__index = Config

function Config.new()
  return setmetatable({_data={}}, Config)
end

function Config:set(k,v) self._data[k]=v; return self end
function Config:build() return self._data end

local cfg = Config.new()
  :set("host","localhost")
  :set("port",8080)
  :set("debug",true)
  :build()

print(cfg.host, cfg.port)

कॉपी कंस्ट्रक्टर

कॉपी कंस्ट्रक्टर किसी मौजूदा इंस्टेंस के समान मानों वाला नया इंस्टेंस बनाता है। महत्वपूर्ण बात: नेस्टेड तालिकाओं को साझा करना है या स्वतंत्र रखना है, इसके आधार पर उथली या गहरी कॉपी का उपयोग करें।

local function deepCopy(orig)
  if type(orig)~="table" then return orig end
  local copy = {}
  for k,v in pairs(orig) do copy[deepCopy(k)]=deepCopy(v) end
  return setmetatable(copy, getmetatable(orig))
end

local Item = {}
Item.__index = Item

function Item.new(name, stats)
  return setmetatable({name=name, stats=stats or {}}, Item)
end

function Item:clone()
  return deepCopy(self)
end

local sword = Item.new("Sword",{damage=50})
local clone = sword:clone()
clone.stats.damage = 30
print(sword.stats.damage)  -- 50 (unchanged)

मान्यता-जाँच वाला कंस्ट्रक्टर

कंस्ट्रक्टर के इनपुट की हमेशा मान्यता जाँच करें। स्तर 2 पर अमान्य इनपुट के लिए स्पष्ट त्रुटियाँ उत्पन्न करें (दोष कॉल करने वाले का है)। इससे बग जल्दी पकड़ में आते हैं और उपयोगी त्रुटि संदेश मिलते हैं।

local Rectangle = {}
Rectangle.__index = Rectangle

function Rectangle.new(w, h)
  assert(type(w)=="number" and w>0,"width must be positive number")
  assert(type(h)=="number" and h>0,"height must be positive number")
  return setmetatable({width=w, height=h}, Rectangle)
end

function Rectangle:area() return self.width * self.height end
function Rectangle:perimeter() return 2*(self.width+self.height) end

local r = Rectangle.new(5, 3)
print(r:area(), r:perimeter())  -- 15  16

डिफ़ॉल्ट मान पैटर्न

वैकल्पिक कंस्ट्रक्टर पैरामीटर को साफ़-सुथरे ढंग से सँभालने के लिए डिफ़ॉल्ट तालिका का उपयोग करें। इससे x = x or default की लंबी श्रृंखलाओं से बचा जा सकता है और डिफ़ॉल्ट मान स्पष्ट तथा आसानी से बदले जा सकते हैं।

local Sprite = {}
Sprite.__index = Sprite

local DEFAULTS = {x=0,y=0,rotation=0,scale=1,visible=true,alpha=1}

function Sprite.new(image, opts)
  local cfg = opts or {}
  local self = {image=image}
  for k,v in pairs(DEFAULTS) do
    self[k] = cfg[k] ~= nil and cfg[k] or v
  end
  return setmetatable(self, Sprite)
end

local s = Sprite.new("hero.png",{x=100,y=200})
print(s.x,s.y,s.scale)  -- 100 200 1

स्थिर फ़ैक्टरी विधियाँ

किसी वर्ग में अलग-अलग निर्माण परिस्थितियों के लिए कई फ़ैक्टरी विधियाँ हो सकती हैं। कई वैकल्पिक पैरामीटर वाले एक ही कंस्ट्रक्टर को जटिल बनाने की तुलना में यह अधिक साफ़ तरीका है।

local Color = {}
Color.__index = Color

function Color.fromRGB(r,g,b)
  return setmetatable({r=r,g=g,b=b}, Color)
end

function Color.fromHex(hex)
  hex = hex:gsub("#","")
  return setmetatable({
    r=tonumber(hex:sub(1,2),16),
    g=tonumber(hex:sub(3,4),16),
    b=tonumber(hex:sub(5,6),16),
  }, Color)
end

function Color:toHex()
  return string.format("#%02X%02X%02X",self.r,self.g,self.b)
end

local red = Color.fromHex("#FF0000")
print(red:toHex())  -- #FF0000

कंस्ट्रक्टर रजिस्ट्री

सभी इंस्टेंस का रिकॉर्ड रखने के लिए रजिस्ट्री का उपयोग करें। इससे "सभी को नष्ट करें" जैसी वैश्विक कार्रवाइयाँ करना या किसी प्रकार के सभी ऑब्जेक्ट पर क्रम से काम करना संभव होता है।

local Enemy = {}
Enemy.__index = Enemy
Enemy._all = {}

function Enemy.new(name, hp)
  local self = setmetatable({name=name, hp=hp}, Enemy)
  Enemy._all[#Enemy._all+1] = self
  return self
end

function Enemy.destroyAll()
  for _, e in ipairs(Enemy._all) do
    print("Destroying:", e.name)
  end
  Enemy._all = {}
end

Enemy.new("Goblin",30)
Enemy.new("Orc",80)
print("Count:", #Enemy._all)  -- 2
Enemy.destroyAll()

विलंबित प्रारंभ

कुछ फ़ील्ड की गणना करना महँगा होता है। पहली बार पहुँचने पर उनकी गणना करके उन्हें कैश करने के लिए किसी फ़ंक्शन के साथ __index का उपयोग करें।

local BigData = {}
BigData.__index = function(t, k)
  if k == "processed" then
    print("Computing processed...")
    local result = {}
    for i,v in ipairs(rawget(t,"raw")) do result[i]=v*2 end
    rawset(t,"processed",result)
    return result
  end
end

function BigData.new(raw)
  return setmetatable({raw=raw}, BigData)
end

local d = BigData.new({1,2,3,4,5})
print(d.processed[3])  -- Computing...  6
print(d.processed[3])  -- 6 (cached, no recompute)

इंस्टेंस से प्रोटोटाइप

समान आधार मानों वाला दूसरा इंस्टेंस बनाने के लिए किसी इंस्टेंस का क्लोन बनाएँ। क्लोन को वही मेटाटेबल (वही वर्ग) और इंस्टेंस डेटा की एक कॉपी मिलती है। यह "टेम्पलेट" ऑब्जेक्ट के लिए उपयोगी है।

local Unit = {}
Unit.__index = Unit

function Unit.new(t)
  return setmetatable({name=t.name,hp=t.hp,atk=t.atk}, Unit)
end

function Unit:clone()
  return Unit.new({name=self.name,hp=self.hp,atk=self.atk})
end

function Unit:__tostring()
  return self.name.."(HP:"..self.hp..",ATK:"..self.atk..")"
end

local template = Unit.new({name="Soldier",hp=100,atk=10})
local u1 = template:clone(); u1.name="Alpha"
local u2 = template:clone(); u2.name="Beta"
print(tostring(u1),tostring(u2))

कंस्ट्रक्टर की त्रुटि-सुरक्षा

यदि निर्माण बीच में विफल हो जाए (जैसे संसाधन आवंटन के दौरान), तो सुनिश्चित करें कि अधूरे ऑब्जेक्ट बाहर न निकलें। निर्माण संबंधी त्रुटियाँ पकड़ने और आवश्यकता होने पर संसाधनों को साफ़ करने के लिए pcall का उपयोग करें।

local FileHandle = {}
FileHandle.__index = FileHandle

function FileHandle.new(path, mode)
  local f, err = io.open(path, mode or "r")
  if not f then
    return nil, "cannot open " .. path .. ": " .. err
  end
  return setmetatable({_f=f, path=path}, FileHandle)
end

function FileHandle:read(fmt) return self._f:read(fmt) end
function FileHandle:close() self._f:close() end

local fh, err = FileHandle.new("data.txt")
if not fh then print("Error:", err)
else print(fh:read("l")); fh:close()
end

त्वरित जाँच

Lua OOP में कंस्ट्रक्टर (new()) की क्या भूमिका है?

पुनरावलोकन: कंस्ट्रक्टर

सारांश:

  • कंस्ट्रक्टर मान्यता जाँचता है, प्रारंभ करता है और setmetatable को कॉल करता है
  • साफ़-सुथरे वैकल्पिक पैरामीटर के लिए डिफ़ॉल्ट तालिका का उपयोग करें
  • अलग-अलग निर्माण परिस्थितियों के लिए कई फ़ैक्टरी विधियाँ रखें
  • टेम्पलेट ऑब्जेक्ट के लिए क्लोन कंस्ट्रक्टर का उपयोग करें
  • महँगे फ़ील्ड के लिए __index के माध्यम से विलंबित प्रारंभ करें
  • विफलता (संसाधन आवंटन) पर कंस्ट्रक्टर से nil+err लौटाएँ
शुरुआत निःशुल्क

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

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

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

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

क्या “कंस्ट्रक्टर और new()” पाठ निःशुल्क है?

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

“कंस्ट्रक्टर और new()” में मैं क्या सीखूँगा?

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

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

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

“कंस्ट्रक्टर और new()” पाठ पूरा करने में कितना समय लगता है?

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

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

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

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

  1. मेटाटेबल के माध्यम से क्लास
  2. कंस्ट्रक्टर और new()
  3. इंस्टेंस मेथड और self
  4. क्लोज़र से एनकैप्सुलेशन
← Lua Academy पर वापस जाएँ