我在Lua文档中发现了一段奇怪的代码:
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
Run Code Online (Sandbox Code Playgroud)
为什么local再次使用i1和i2?它们是否已在局部变量中声明?local每次要分配关键字时,是否必须重复关键字?
不,没有必要local一遍又一遍地使用.变量i1和i2将local在该函数的范围,因为第一线本身.
虽然不应该这样做,但一遍又一遍地定义相同的变量并没有错.它只会将堆栈中的新位置分配给较新的位置,并遮挡较旧的位置.
以下是一个简单函数的指令输出:
function t()
local i = 2
local i = 3
end
t()
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
和更新的第二local i = 3只i = 3:
function t()
local i = 2
i = 3
end
t()
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
注意第二条指令的区别.
除此之外,该功能效率很低.您可以改为使用以下内容:
function Trim(sInput)
return sInput:match "^%s*(.-)%s*$"
end
Run Code Online (Sandbox Code Playgroud)
从技术上讲,local在第二个声明中使用与否并不相同.使用秒local将声明另一个变量.
但是在您的示例代码中,它们基本相同.检查这些更简单的代码:
local a = 0
local a = 1
Run Code Online (Sandbox Code Playgroud)
和
local a = 0
a = 1
Run Code Online (Sandbox Code Playgroud)
使用luac -p -l输出以下结果:
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
Run Code Online (Sandbox Code Playgroud)
和
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
Run Code Online (Sandbox Code Playgroud)