2016-03-02 4 views
8

मैं लुआ दस्तावेज में कोड का एक अजीब टुकड़ा मिल गया है:लुआ - स्थानीय आवश्यक eveytime एक स्थानीय चर असाइन किया गया है?

function trim8(s) 
    local i1,i2 = find(s,'^%s*') 
    if i2 >= i1 then s = sub(s,i2+1) end 
    local i1,i2 = find(s,'%s*$') 
    if i2 >= i1 then s = sub(s,1,i1-1) end 
    return s 
end 

क्यों locali1 और i2 साथ एक बार फिर से प्रयोग किया जाता है? क्या वे पहले से ही स्थानीय चर के बीच घोषित नहीं हैं? क्या आपको हर बार local कीवर्ड दोहराना होगा जब आप उन्हें असाइन करना चाहते हैं?

उत्तर

7

नहीं, local का उपयोग करना आवश्यक नहीं है। पहली पंक्ति के कारण फ़ंक्शन के दायरे में i1 और i2 वेरिएबल्स local होंगे।

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

निम्नलिखित एक सरल कार्य के लिए अनुदेश उत्पादन होता है:

function t() 
    local i = 2 
    local i = 3 
end 
t() 
function <temp.lua:1,4> (3 instructions, 12 bytes at 00658990) 
0 params, 2 slots, 0 upvalues, 2 locals, 2 constants, 0 functions 
     1  [2]  LOADK   0 -1 ; 2 
     2  [3]  LOADK   1 -2 ; 3 
     3  [4]  RETURN   0 1 

और अद्यतन करने के दूसरे local i = 3 करने के लिए सिर्फ i = 3:

function t() 
    local i = 2 
    i = 3 
end 
t() 
function <temp.lua:1,4> (3 instructions, 12 bytes at 00478990) 
0 params, 2 slots, 0 upvalues, 1 local, 2 constants, 0 functions 
     1  [2]  LOADK   0 -1 ; 2 
     2  [3]  LOADK   0 -2 ; 3 
     3  [4]  RETURN   0 1 

सूचना दूसरे पर अंतर अनुदेश।


इसके अलावा, कार्य काफी अक्षम है। इसके बजाय आप निम्न का उपयोग कर सकते हैं:

function Trim(sInput) 
    return sInput:match "^%s*(.-)%s*$" 
end 
+2

ढेर पदों (स्थानीय चर) अधीन नहीं हैं:

local a = 0 local a = 1 

और

local a = 0 a = 1 

उपयोग luac -p -l निम्न परिणाम आउटपुट कचरा संग्रह करने के लिए। छायांकित स्थानीय चर में संग्रहीत एक मूल्य को अभी भी सुलभ माना जाता है। –

+0

@EgorSkriptunoff क्या आपके पास इसके लिए एक विनिर्देश संदर्भ है या यह अवलोकन पर आधारित है? (मुझे पता है कि मैंने डीबगर लिखते समय मानक कार्यान्वयन में छायांकित स्थानीय लोगों को देखा है।) लेकिन, क्या एक कंपाइलर स्टैक उपयोग को अनुकूलित करने के लिए स्वतंत्र नहीं है? –

+0

@ टॉमब्लोडेट - आईएमओ, यह बहुत ही असंभव है कि ठेठ अनुकूलन सामान्य लुआ कार्यक्रमों के लिए उपयोगी होगा। –

5

तकनीकी तौर पर, दूसरा घोषणा में local या नहीं का उपयोग कर समान नहीं होते हैं। दूसरे local का उपयोग करके एक और चर घोषित किया जाएगा।

हालांकि आपके उदाहरण कोड में, वे मूल रूप से वही हैं। इन सरल कोड की जाँच करें:

0+ params, 2 slots, 0 upvalues, 2 locals, 2 constants, 0 functions 
    1 [1] LOADK  0 -1 ; 0 
    2 [2] LOADK  1 -2 ; 1 
    3 [2] RETURN  0 1 

और

0+ params, 2 slots, 0 upvalues, 1 local, 2 constants, 0 functions 
    1 [1] LOADK  0 -1 ; 0 
    2 [2] LOADK  0 -2 ; 1 
    3 [2] RETURN  0 1 
+0

हे, मैंने अभी आपकी मदद के लिए 'luac -l' output = P – hjpotter92

+0

के साथ अपना उत्तर अपडेट किया है। तो जब आप 'ए' घोषित करते हैं तो पहचानकर्ता 'ए' द्वारा संदर्भित चर है? दूसरा घोषित किया गया था? – Virus721

+0

@ वायरस 721 पूरे बयान के बाद जो दूसरा घोषित करता है, यह दूसरा होगा, उदाहरण के लिए 'स्थानीय ए = 0; स्थानीय ए = ए + 1' दूसरे चर में मान 0 + 1 असाइन करेगा। –

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