खोज…


परिचय

लूआ खुद कोई क्लास सिस्टम नहीं देता है। हालाँकि, यह केवल कुछ तरकीबों के साथ टेबल के रूप में कक्षाओं और वस्तुओं को लागू करना संभव है।

वाक्य - विन्यास

  • function <class>.new() return setmetatable({}, {__index=<class>}) end

सिंपल ऑब्जेक्ट ओरिएंटेशन

यहाँ एक बहुत ही सरल वर्ग प्रणाली कैसे करें, इसका एक मूल उदाहरण दिया गया है

Class = {}
local __instance = {__index=Class} -- Metatable for instances
function Class.new()
    local instance = {}
    setmetatable(instance, __instance)
    return instance
-- equivalent to: return setmetatable({}, __instance)
end

चरों और / या विधियों को जोड़ने के लिए, उन्हें कक्षा में जोड़ें। दोनों को हर उदाहरण के लिए ओवरराइड किया जा सकता है।

Class.x = 0
Class.y = 0
Class:getPosition()
    return {self.x, self.y}
end

और कक्षा का एक उदाहरण बनाने के लिए:

object = Class.new()

या

setmetatable(Class, {__call = Class.new}
    -- Allow the class itself to be called like a function
object = Class()

और इसका उपयोग करने के लिए:

object.x = 20
-- This adds the variable x to the object without changing the x of
-- the class or any other instance. Now that the object has an x, it
-- will override the x that is inherited from the class
print(object.x)
-- This prints 20 as one would expect.
print(object.y)
-- Object has no member y, therefore the metatable redirects to the
-- class table, which has y=0; therefore this prints 0
object:getPosition() -- returns {20, 0}

किसी वस्तु का मेटामेथोड बदलना

बीत रहा है

local Class = {}
Class.__meta = {__index=Class}
function Class.new() return setmetatable({}, Class.__meta)

यह मानते हुए कि हम किसी एकल उदाहरण object = Class.new() का उपयोग करके परिवर्तन करना चाहते हैं

बचने के लिए कुछ गलतियाँ हैं:

setmetatable(object, {__call = table.concat}) -- WRONG

यह नए के साथ पुराने मेटाबुल का आदान-प्रदान करता है, इसलिए कक्षा की विरासत को तोड़ता है

getmetatable(object).__call = table.concat -- WRONG AGAIN

ध्यान रखें कि तालिका "मान" केवल संदर्भ हैं; वास्तव में, किसी वस्तु के सभी उदाहरणों के लिए केवल एक वास्तविक तालिका है जब तक कि निर्माता को 1 के रूप में परिभाषित नहीं किया जाता है, इसलिए ऐसा करने से हम कक्षा के सभी उदाहरणों के व्यवहार को संशोधित करते हैं।


ऐसा करने का एक सही तरीका:

बिना कक्षा बदले:

setmetatable(
    object,
    setmetatable(
        {__call=table.concat},
        {__index=getmetatable(object)}
    )
)

यह कैसे काम करता है? - हम # 1 की गलती के रूप में एक नया मेटाबॉलिज्म बनाते हैं, लेकिन इसे खाली छोड़ने के बजाय, हम मूल मेटाबल के लिए एक सॉफ्ट कॉपी बनाते हैं। कोई कह सकता है कि नए मेटाबैटिक "इनहेरिट्स" मूल से एक है जैसे कि यह एक वर्ग उदाहरण था। अब हम उन्हें संशोधित किए बिना मूल मेटाबॉलिज्म के मूल्यों को ओवरराइड कर सकते हैं।

कक्षा को बदलना:

1 (अनुशंसित):

local __instance_meta = {__index = Class.__meta}
-- metatable for the metatable
-- As you can see, lua can get very meta very fast
function Class.new()
    return setmetatable({}, setmetatable({}, __instance_meta))
end

दूसरा (कम अनुशंसित): 1 देखें


1 function Class.new() return setmetatable({}, {__index=Class}) end



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow