Lua - 本地所需的eveytime分配了一个局部变量?

时间:2016-03-02 09:07:53

标签: lua

我在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

为什么locali1再次使用i2?它们是否已在局部变量中声明?每次要分配它们时,是否必须重复local个关键字?

2 个答案:

答案 0 :(得分:7)

不,没有必要一遍又一遍地使用local。由于第一行本身,变量i1i2在函数范围内将为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

答案 1 :(得分:5)

从技术上讲,在第二个声明中使用local或不同等。使用第二个local将声明另一个变量。

但是在您的示例代码中,它们基本相同。检查这些更简单的代码:

local a = 0
local a = 1

local a = 0
a = 1

使用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

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