2013-06-06 7 views
5

Ho studiato Lua e mi chiedevo se è consentito fare riferimento a due variabili locali con lo stesso nome.Lua - Due variabili locali con lo stesso nome

Ad esempio, nel seguente segmento di codice, la sintassi è legale (senza undefined behavior)?

Chiedo perché funziona, ma non riesco a capire cosa sta succedendo dietro le quinte. Si tratta semplicemente di riferimento allo stesso x locale? O ci sono ora due variabili local x che rovinano le cose dietro le quinte. Mi piacerebbe sapere cosa sta succedendo esattamente qui e perché è il caso.

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

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

risposta

7

Ci sono due variabili. La seconda ombra (ma non rimuove o sovrascrive) la prima.

A volte è ancora possibile accedere alla definizione precedente tramite una chiusura.

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

esempio molto chiaro. Interessante e buono a sapersi! Grazie! – MrHappyAsthma

4

Sì, è legale. Lua gestisce local - dichiarazioni variabili come statements.

Ecco un esempio interessante dal Lua Reference Manual:

Si noti che ogni esecuzione di un'istruzione locale definisce nuove variabili locali. Si consideri il seguente esempio:

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

Il ciclo crea dieci chiusure (vale a dire, dieci istanze della funzione anonima). Ognuna di queste chiusure usa una variabile y diversa, mentre tutte condividono la stessa x.

In questo esempio, se ignorare la parte rinvio chiusura, ci sono 10 local variabili denominate y nello stesso for blocco.

8

Tutte le variabili locali sono stati ricordati da Lua :-)

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 per il risultato può essere visto in Lua –