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

为什么 local 再次与 i1i2 一起使用?难道它们不是已经在局部变量中声明了吗?你每次想要分配它们都必须重复使用 local 关键字吗?

点赞
用户1190388
用户1190388

不需要一遍又一遍地使用 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
2016-03-02 09:15:34
用户1009479
用户1009479

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

然而,在你的示例代码中,它们基本上是相同的。检查以下这些简单代码:

local a = 0
local a = 1

local a = 0
a = 1

使用 luac -p -l 输出以下结果:

0+ 参数,2 个插槽,0 个上值,2 个本地变量,2 个常量,0 个函数
    1   [1] LOADK       0 -1     ; 0
    2   [2] LOADK       1 -2     ; 1
    3   [2] RETURN      0 1

0+ 参数,2 个插槽,0 个上值,1 个本地变量,2 个常量,0 个函数
    1   [1] LOADK       0 -1     ; 0
    2   [2] LOADK       0 -2     ; 1
    3   [2] RETURN      0 1
2016-03-02 09:26:46