मेटाटेबल का परिचय
setmetatable/getmetatable से मेटाटेबल सेट और प्राप्त करें।
मेटाटेबल का परिचय, CoddyKit पर Lua Academy का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Lua Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Lua Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
मेटाटेबल क्या है
metatable एक सामान्य Lua टेबल है, जो किसी अन्य टेबल के व्यवहार को नियंत्रित करती है। जब Lua किसी टेबल पर ऐसा ऑपरेशन देखता है जिसे वह स्वयं नहीं कर सकता (जैसे अंकगणित या अनुपस्थित कुंजी का अनुक्रमण), तो वह मेटाटेबल में संबंधित मेटामेथड खोजता है। यह ऑपरेटर ओवरलोडिंग और OOP के लिए Lua का विस्तार तंत्र है।
local t = {}
local mt = {__index = function(_, k) return "default_" .. k end}
setmetatable(t, mt)
print(t.foo) -- default_foo
print(t.bar) -- default_bar
print(t[1]) -- default_1setmetatable और getmetatable
setmetatable(t, mt), t की मेटाटेबल को mt पर सेट करता है और t लौटाता है। getmetatable(t) मेटाटेबल लौटाता है, या न होने पर nil लौटाता है। mt.__metatable = "protected" सेट करके आप मेटाटेबल को बदले जाने से सुरक्षित कर सकते हैं।
local t = {x = 10}
local mt = {}
setmetatable(t, mt)
print(getmetatable(t) == mt) -- true
-- Protect metatable
mt.__metatable = "locked"
print(getmetatable(t)) -- locked
-- setmetatable(t, {}) -- ERROR: cannot change protected metatableटेबल के रूप में __index
जब __index एक टेबल होता है, तो Lua अनुपस्थित कुंजी को उस टेबल में खोजता है। यही Lua के प्रोटोटाइप इनहेरिटेंस का आधार है। यदि __index में भी कुंजी नहीं मिलती, तो Lua उसकी मेटाटेबल जाँचता है और इसी तरह शृंखला में आगे बढ़ता है।
local Animal = {sound = "...", legs = 4}
local Dog = setmetatable({sound = "Woof"}, {__index = Animal})
local Cat = setmetatable({sound = "Meow"}, {__index = Animal})
print(Dog.sound) -- Woof (own field)
print(Dog.legs) -- 4 (from Animal)
print(Cat.sound) -- Meow
print(Cat.legs) -- 4फ़ंक्शन के रूप में __index
जब __index एक फ़ंक्शन होता है, तो Lua उसे टेबल और अनुपस्थित कुंजी के साथ कॉल करता है। फ़ंक्शन मान की गणना कर सकता है या उसे गतिशील रूप से प्राप्त कर सकता है। "कुंजी नहीं मिली" दर्शाने के लिए __index से nil लौटाएँ।
local dynamic = setmetatable({}, {
__index = function(t, k)
if k:sub(1,4) == "get_" then
local field = k:sub(5)
return function(self) return self[field] end
end
return nil
end
})
dynamic.name = "Lua"
local getter = dynamic.get_name
print(getter(dynamic)) -- Luarawget और rawset
rawget(t, k), __index को ट्रिगर किए बिना टेबल की कुंजी पढ़ता है। rawset(t, k, v), __newindex को ट्रिगर किए बिना कुंजी सेट करता है। अनंत पुनरावृत्ति से बचने के लिए मेटामेथड के भीतर सीधे टेबल तक पहुँचने की आवश्यकता होने पर इनका उपयोग करके मेटामेथड को दरकिनार करें।
local logged = setmetatable({}, {
__newindex = function(t, k, v)
print("Setting", k, "=", v)
rawset(t, k, v) -- bypass __newindex
end
})
logged.x = 10 -- Setting x = 10
logged.x = 20 -- no log! key now exists in t
print(logged.x) -- 20एक मेटाटेबल साझा करने वाली अनेक टेबलें
एक ही मेटाटेबल को कई टेबलें साझा कर सकती हैं। Lua की वर्ग-प्रणालियाँ इसी तरह काम करती हैं: किसी वर्ग के सभी इंस्टेंस एक ही मेटाटेबल साझा करते हैं, जिसमें मेथड मौजूद होते हैं। मेटाटेबल में किए गए बदलाव सभी इंस्टेंस को प्रभावित करते हैं।
local Mt = {
__index = {
greet = function(self)
print("Hello from " .. (self.name or "?"))
end
}
}
local a = setmetatable({name="Alice"}, Mt)
local b = setmetatable({name="Bob"}, Mt)
a:greet() -- Hello from Alice
b:greet() -- Hello from Bob__metatable फ़ील्ड
mt.__metatable को किसी भी मान पर सेट करने से getmetatable वास्तविक मेटाटेबल के बजाय वही मान लौटाता है। इससे उपयोगकर्ता मेटाटेबल का निरीक्षण या उसे बदल नहीं पाते—यह एनकैप्सुलेशन और सुरक्षा के लिए उपयोगी है।
local secret = setmetatable({}, {
__metatable = false, -- hide metatable
__index = {value = 42}
})
print(secret.value) -- 42
print(getmetatable(secret)) -- false (not the real mt)
-- setmetatable(secret, {}) -- ERRORमेटाटेबल की जाँच
यह जाँचने के लिए getmetatable(t) का उपयोग करें कि किसी ऑब्जेक्ट की कोई विशिष्ट मेटाटेबल है या नहीं (प्रकार की जाँच के लिए)। चूँकि __metatable वास्तविक मेटाटेबल को छिपा सकता है, इसलिए विश्वसनीय isinstance जाँच के लिए rawequal या किसी संकेतक फ़ील्ड का उपयोग करें।
local MyClass = {}
MyClass.__index = MyClass
MyClass.__metatable = MyClass -- use self as marker
function MyClass.new(x)
return setmetatable({x=x}, MyClass)
end
local obj = MyClass.new(5)
print(getmetatable(obj) == MyClass) -- true
print(obj.x) -- 5टेबल के अलावा अन्य मानों पर मेटाटेबल
Lua में स्ट्रिंग के पास पहले से एक मेटाटेबल होती है (string मॉड्यूल)। इसी कारण आप किसी भी स्ट्रिंग पर s:upper() कॉल कर सकते हैं। शुद्ध Lua से स्ट्रिंग, संख्या या बूलियन पर मेटाटेबल सेट नहीं की जा सकती—केवल टेबल और userdata पर की जा सकती है।
local s = "hello"
local mt = getmetatable(s)
-- String metatable has __index = string library
print(mt.__index == string) -- true
-- So all string functions are methods:
print(s:upper()) -- HELLO
print(s:rep(3, "-")) -- hello-hello-helloमेटाटेबल से डीबग करना
आप किसी टेबल को tostring() और print() में किस तरह दिखाया जाए, इसे नियंत्रित करने के लिए उसमें __tostring मेटामेथड जोड़ सकते हैं। जटिल ऑब्जेक्ट को डीबग करते समय यह अत्यंत उपयोगी होता है।
local Point = {}
Point.__index = Point
Point.__tostring = function(p)
return string.format("Point(%g, %g)", p.x, p.y)
end
function Point.new(x, y)
return setmetatable({x=x,y=y}, Point)
end
local p = Point.new(3, 4)
print(tostring(p)) -- Point(3, 4)
print(p) -- Point(3, 4) (print calls tostring)त्वरित जाँच
जब आप ऐसी टेबल में ऐसी कुंजी का मान पढ़ते हैं जो मौजूद नहीं है और जिसकी मेटाटेबल में __index किसी दूसरी टेबल पर सेट है, तब क्या होता है?
पुनरावृत्ति: मेटाटेबल
सारांश:
setmetatable(t, mt)/getmetatable(t)__index: टेबल → प्रोटोटाइप में खोज; फ़ंक्शन → गतिशील प्रेषणrawget/rawsetमेटामेथड को बायपास करते हैं- साझा मेटाटेबल वर्ग-जैसा व्यवहार सक्षम करती हैं
__metatableमेटाटेबल को निरीक्षण से सुरक्षित रखता है__tostringप्रिंट के परिणाम को नियंत्रित करता है
एआई शिक्षक के साथ Lua सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 40
- पाठ
- 159
अक्सर पूछे जाने वाले प्रश्न
क्या “मेटाटेबल का परिचय” पाठ निःशुल्क है?
हाँ — Lua Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “मेटाटेबल का परिचय” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Lua Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“मेटाटेबल का परिचय” में मैं क्या सीखूँगा?
setmetatable/getmetatable से मेटाटेबल सेट और प्राप्त करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Lua Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Lua Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Lua Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।
“मेटाटेबल का परिचय” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Lua Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Lua Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- मेटाटेबल का परिचय
- __index और __newindex
- अंकगणितीय मेटामेथड
- __tostring और __len