Lua 闭包

这篇博客详细介绍了Lua中的函数特性,包括函数作为第一类值、匿名函数、高阶函数、在table中定义函数、非全局函数,以及闭包和作用域外溢现象。同时,讨论了如何更换预定义函数,以及在编程实践中可能遇到的问题和解决方案。
摘要由CSDN通过智能技术生成

一、Lua 中的函数

Lua 中的函数是第一类值。意味着和其他的常见类型的值(例如数值和字符串)具有同等权限。

举个例子,函数也可以像其他类型一样存储起来,然后调用

-- 将 a.p 指向 print 函数
a = {
    p = print }
-- 使用 a.p 函数
a.p("jiangpengyong")    ---> jiangpengyong

二、匿名函数

正常情况下,我们定义一个函数是下面代码这样的

function foo1()
    print("Foo1 called.")
end

然而,其实可以写成下面这样,将函数赋值给一个变量,这样 foo 就是一个函数类型的变量了。

foo = function(x)
    return x * x
end

其实 Lua 的函数就是一个 function 类型的变量(可以查看之前的文章“Lua 数据类型 —— 函数”)。第一种方式变量名即为函数名(foo1),第二种则为变量名(foo)

因为函数是一个变量,所以也可以进行判断类型,删除变量等操作。

foo = function(x)
    return x * x
end
print(foo(2))					-->	4
print("type(foo)", type(foo))	-->	type(foo)	function

function foo1()
    print("Foo1 called.")
end
foo1()							--> Foo1 called.
print("type(foo1)", type(foo1))	--> type(foo1)	function
foo1 = nil
--foo1()    -- attempt to call a nil value (global 'foo1')
print("type(foo1)", type(foo1))	--> type(foo1)	nil

三、高阶函数

以另一个函数作为参数的函数,即为高阶函数。

其实这只是 Lua 函数作为第一类值特性的一个表现,并不是新的特性。

举个例子:

这里编写一个导数函数

f`(x) = (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值