Lua non-global stored (exp: local and table elements) function

  1. 云栖社区>
  2. 博客列表>
  3. 正文

Lua non-global stored (exp: local and table elements) function

德哥 2016-03-29 15:12:11 浏览617 评论0

摘要: 上一篇聊了一下Lua函数, 严格来说聊的是closure. 包含两个部分, 1个是变量部分, 一个是定义部分.Lua函数/closure一般存储在全局变量中, 但也可以存储在本地变量或者表的元素中. 例如 :  io.

上一篇聊了一下Lua函数, 严格来说聊的是closure. 包含两个部分, 1个是变量部分, 一个是定义部分.
Lua函数/closure一般存储在全局变量中, 但也可以存储在本地变量或者表的元素中.
例如 : 
io.open, 这个函数其实就是存储在io这个表里面的.
> print (io.open)
function: 0x12a34e0
> print (io)
table: 0x1283fc0

把函数存储在表中, 支持三种定义方法.
> tbl = {}
> tbl.f = function() end
或
> function tbl.f () end
或直接这样
> tbl = {f = function () end}


如果把函数存储在本地变量中, 需要注意:
[root@db-172-16-3-150 ~]# vi lua
local f = function(n)
  if n == 0 then return 1
  else return n * f(n-1)  -- 这里的f(n-1)找不到, 会报错.
  end
end
print(f(10))

[root@db-172-16-3-150 ~]# lua ./lua 
lua: ./lua:3: attempt to call global 'f' (a nil value)
stack traceback:
        ./lua:3: in function 'f'
        ./lua:6: in main chunk
        [C]: in ?


必须先声明local变量, 才能在这个函数中使用递归, 否则递归函数会使用全局变量.
[root@db-172-16-3-150 ~]# vi lua
local f 
f = function(n)
  if n == 0 then return 1
  else return n * f(n-1)  -- f先声明后, 可以找到这个本地变量, 所以不会报错
  end
end
print(f(10))

[root@db-172-16-3-150 ~]# lua ./lua 
3628800

全局变量不存在这个问题.
> f = function(n)
  if n == 0 then return 1
  else return n * f(n-1)
  end
end
> print(f(10))
3628800


小结
1. 本地变量函数, 建议先声明本地变量, 在定义函数.
【云栖快讯】阿里云栖开发者沙龙(Java技术专场)火热来袭!快来报名参与吧!  详情请点击

网友评论