2012-09-11 6 views
15

क्या लुआ में कोई कॉन्स कीवर्ड है? या कोई अन्य समान बात? क्योंकि मैं अपने चर को कॉन्स्ट के रूप में परिभाषित करना चाहता हूं और चर के मान को बदलने से रोकना चाहता हूं। अग्रिम धन्यवाद।क्या कोई ऐसा कीवर्ड है जैसे कॉन्स या कुछ और जो लुआ में इसके साथ एक ही काम करता है?

उत्तर

11

लुआ स्वचालित रूप से समर्थन स्थिरांक नहीं है, लेकिन आप उस कार्यक्षमता को जोड़ सकते हैं। उदाहरण के लिए अपने स्थिरांक को एक टेबल में डालकर, और तालिका को केवल मेटाटेबल का उपयोग करके पढ़ना।

तरीके से ऐसा करने के लिए है: http://andrejs-cainikovs.blogspot.se/2009/05/lua-constants.html

उलझन है कि आपके स्थिरांक के नाम केवल "ए" और "बी", लेकिन "CONSTANTS.A" और "CONSTANTS.B की तरह कुछ नहीं होगा "। आप अपने सभी स्थिरांक को एक तालिका में डालने का निर्णय ले सकते हैं, या उन्हें कई तालिकाओं में तर्कसंगत रूप से समूहित करने का निर्णय ले सकते हैं; उदाहरण के लिए गणित स्थिरांक आदि के लिए "MATH.E" और "MATH.PI"

+2

भी http://lua-users.org/wiki/ReadOnlyTables देखें:

आप रक्षित 'विश्व स्तर पर निर्धारित वेरिएबल (संरक्षित तालिकाओं की तुलना में) करने के लिए इस छोटे से तरीके का उपयोग कर सकते हैं। और ध्यान दें कि आप ग्लोबल स्थिरांक (प्रदर्शन में कुछ लागत पर) अनुकरण करने के लिए केवल पढ़ने के लिए '_ENV' और/या '_G' सेट कर सकते हैं। – finnw

+0

यह @finnw द्वारा पोस्ट किए गए लिंक से एक बहुत ही महत्वपूर्ण नोट जैसा लगता है:" इसके अलावा, केवल पढ़ने योग्य टेबल बनाने की यह विधि ** जोड़े, आईपीएयर, अगली, # ऑपरेटर **, और तालिका पुनरावृत्ति के अन्य रूपों में हस्तक्षेप करती है। " – chris

2

लुआ या इसी तरह के निर्माण में कोई const कीवर्ड नहीं है।

सबसे आसान समाधान एक टिप्पणी में एक बड़ी सावधानी लिखने के लिए, कह रही है कि यह इस चर करने के लिए लिखने के लिए मना किया है है ...

हालांकि यह तकनीकी रूप से संभव एक वैश्विक लिए लिख (या पढ़ने) ना करे के लिए है लूआ 5.2 में वैश्विक पर्यावरण _G (या _ENV) के लिए एक मेटाटेबल प्रदान करके परिवर्तनीय।

कुछ इस तरह:

local readonly_vars = { foo=1, bar=1, baz=1 } 
setmetatable(_G, {__newindex=function(t, k, v) 
    assert(not readonly_vars[k], 'read only variable!') 
    rawset(t, k, v) 
end}) 

तो अगर आप foo के लिए कुछ आवंटित करने के लिए प्रयास करते हैं, एक त्रुटि फेंक दिया है।

+0

यह कोड गलत है। यह नए चर सेट करने के खिलाफ सुरक्षा करेगा, लेकिन उन्हें बदल नहीं रहा है। – ZzZombo

3

जैसा कि पहले से ही देखा गया है, लुआ में const नहीं है।

local protected = {} 
function protect(key, value) 
    if _G[key] then 
     protected[key] = _G[key] 
     _G[key] = nil 
    else 
     protected[key] = value 
    end 
end 

local meta = { 
    __index = protected, 
    __newindex = function(tbl, key, value) 
     if protected[key] then 
      error("attempting to overwrite constant " .. tostring(key) .. " to " .. tostring(value), 2) 
     end 
     rawset(tbl, key, value) 
    end 
} 

setmetatable(_G, meta) 

-- sample usage 
GLOBAL_A = 10 
protect("GLOBAL_A") 

GLOBAL_A = 5 
print(GLOBAL_A)