2016-03-02 15 views
8

Znalazłem dziwny kawałek kodu w dokumentacji Lua:Lua - lokalna wymagana jest zawsze przypisana lokalna zmienna?

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 

Dlaczego local wykorzystywane ponownie z i1 i i2? Czy nie są one już zadeklarowane wśród zmiennych lokalnych? Czy musisz powtarzać słowo kluczowe local za każdym razem, gdy chcesz je przypisać?

Odpowiedz

7

Nie, nie jest konieczne wielokrotne używanie local. Zmienne i1 i będą w zakresie funkcji ze względu na samą pierwszą linię.

Chociaż nie należy tego robić, nie ma nic złego w definiowaniu tych samych zmiennych w kółko. Po prostu przydzieli nową pozycję w stosie nowemu i zaciągnie starszą.

Poniżej znajduje się wyjście instrukcja dla prostej funkcji:

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 

i aktualizowanie drugi local i = 3 tylko 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 

zauważyć różnicę na sekundę instrukcja.


Poza tym funkcja jest dość nieefektywna. Zamiast tego można użyć następujących:

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

pozycji stosu (zmienne lokalne) nie podlegają do zbierania śmieci. Wartość przechowywana w shadowed local variable jest nadal uważana za dostępną. –

+0

@ EgorSkriptunoff Czy masz odwołanie do specyfikacji dla tego czy jest to oparte na obserwacji? (Wiem, że widziałem zacienionych locals w standardowej implementacji podczas pisania debuggera.) Ale czy kompilator nie jest wolny, aby zoptymalizować wykorzystanie stosu? –

+0

@TomBlodget - IMO, jest bardzo mało prawdopodobne, że optymalizacja stosu byłaby przydatna w typowych programach Lua. –

5

Technicznie, używając local lub nie w drugim deklaracji nie są równoważne. Użycie drugiego local zadeklaruje inną zmienną.

Jednak w twoim przykładowym kodzie mają one w zasadzie to samo. Sprawdź te prostszy kod:

local a = 0 
local a = 1 

i

local a = 0 
a = 1 

Zastosowanie luac -p -l generuje następujący wynik:

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 

i

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

heh, właśnie zaktualizowałem swoją odpowiedź z wyjściem "luac -l" = P – hjpotter92

+0

Dzięki za pomoc. A więc jaka jest zmienna, do której odnosi się identyfikator "a", gdy dwa razy deklarujesz "a"? Drugi, który został zadeklarowany? – Virus721

+0

@ Virus721 Po zakończeniu całego oświadczenia, które deklaruje drugi, będzie to drugi, Na przykład 'local a = 0; local a = a + 1' przydzieli wartość 0 + 1 do drugiej zmiennej. –

Powiązane problemy