2013-06-06 15 views
5

मैं Lua सीख रहा हूं और मैं सोच रहा था कि इसे उसी नाम के दो स्थानीय चरों को संदर्भित करने की अनुमति है या नहीं।लुआ - एक ही नाम के साथ दो स्थानीय चर

उदाहरण के लिए, निम्नलिखित कोड सेगमेंट में, वाक्यविन्यास कानूनी है (undefined behavior के बिना)?

मैं पूछता हूं क्योंकि यह चलता है, लेकिन मुझे लगता है कि दृश्यों के पीछे क्या हो रहा है। क्या यह बस उसी x स्थानीय का संदर्भ दे रहा है? या अब दो local x वेरिएबल्स हैं जो दृश्यों के पीछे गड़बड़ कर रहे हैं। मैं जानना चाहता हूं कि वास्तव में क्या हो रहा है और यह मामला क्यों है।

local x = 5 + 3; -- = 8 
local x = 3 - 2; -- = 1 

print("x = " .. x); -- x = 1 

उत्तर

7

दो चर हैं। दूसरी छाया (लेकिन पहले को हटा या ओवरराइट नहीं करती)।

कभी-कभी आप बंद होने के माध्यम से पहले की परिभाषा तक पहुंच सकते हैं।

local x = 5 + 3 
local function getX1() 
    return x 
end 
local x = 3 - 2 
local function getX2() 
    return x 
end 

print("x = " .. x); -- x = 1 
print("x = " .. getX1()); -- x = 8 
print("x = " .. getX2()); -- x = 1 
+0

बहुत स्पष्ट उदाहरण। दिलचस्प और जानना अच्छा है! धन्यवाद! परिणाम के लिए – MrHappyAsthma

4

हां, यह कानूनी है। लूआ local - statements के रूप में उपलब्ध घोषणाओं को संभालती है।

सूचना है कि एक स्थानीय बयान से प्रत्येक निष्पादन नया स्थानीय चर को परिभाषित करता है:

यहाँ Lua Reference Manual से एक दिलचस्प उदाहरण है। निम्न उदाहरण पर विचार करें:

a = {} 
local x = 20 
for i=1,10 do 
    local y = 0 
    a[i] = function() y=y+1; return x+y end 
end 

पाश दस बंदी बनाता है (जो है, गुमनाम समारोह के दस मामले)। इनमें से प्रत्येक बंद एक अलग वाई चर का उपयोग करता है, जबकि उनमें से सभी एक ही एक्स साझा करते हैं।

इस उदाहरण में, यदि लौटने बंद हिस्सा उपेक्षा, वहाँ एक ही for ब्लॉक में y नामित 10 local चर हैं।

8

सभी अपने स्थानीय चर लुआ द्वारा याद किया गया है :-)

local x = 5 + 3; -- = 8 
local x = 3 - 2; -- = 1 

local i = 0 
repeat 
    i = i + 1 
    local name, value = debug.getlocal(1, i) 
    if name == 'x' then 
     print(name..' = '..value) 
    end 
until not name 
+0

+1 लुआ में देखा जा सकता है –

संबंधित मुद्दे