कंस्ट्रक्टर और new()
ऐसे कंस्ट्रक्टर फ़ंक्शन लिखें जो इंस्टेंस बनाएँ और उन्हें आरंभ करें।
कंस्ट्रक्टर और 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 पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- मेटाटेबल के माध्यम से क्लास
- कंस्ट्रक्टर और new()
- इंस्टेंस मेथड और self
- क्लोज़र से एनकैप्सुलेशन