Lua 关于函数的更多内容

一、匿名函数
Lua中的函数其实都是匿名函数,我们定义函数的时候:

function foo (x) return 2*x end

等价于

foo = function (x) return 2*x end

这里foo只是保存匿名函数的变量。

1.lua的函数是一种 First-Class Value 的东西, 到底是啥?
就是它们与传统类型的变值没啥区别,
可以 存到一个变量中,
可以 存到table中,
可以 作为实参传递给其它函数,
可以 作为其它函数的返回值.

2.词法域(Lexical Scoping), 也就是说, 一个函数可以嵌套在另一个函数中, 内部的函数可以访问外部函数中的变量.

两者结合,可以发挥神奇的作用,例:

function newCounter()
         local i = 0
         func = function()
                 i = i + 1
                 return i
         end

        return func
 end

c = newCounter()
 print(c())
 print(c())

c1 = newCounter()
 print(c1())
 print(c1())

代码中, 函数 func 里访问了一个 “非局部的变量” i, 用于保存一个计数器
初步看,由于创建变量i的函数 newCounter 已经返回, 所以每次调用 func 时, 应该是超过了作用范围

其实不然, lua 会以 closure 的概念来处理这种情况.
一个 closure 就是一个函数加上该函数所需访问的所有”非局部的变量”

所以上例中 c1, c2 是同个函数所创建的两个不同的 closure, 它们各自拥有局部变量i的独立实例.

从技术上来讲, lua中只有 closure, 而不存在”函数”. 因为”函数”本身就是一种特殊的 closure。

二、非全局函数
函数可以放在表中,也可以放在局部变量中。

三、尾调用排除
lua中函数的最后一次操作若是调用函数,则该操作称为尾调用。尾调用所调用的函数是不会占栈空间的,所以它不会溢出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值