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
pozycji stosu (zmienne lokalne) nie podlegają do zbierania śmieci. Wartość przechowywana w shadowed local variable jest nadal uważana za dostępną. –
@ 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? –
@TomBlodget - IMO, jest bardzo mało prawdopodobne, że optymalizacja stosu byłaby przydatna w typowych programach Lua. –