Lua程序设计之闭包

本文介绍了Lua语言中函数作为第一类值的概念,展示了如何将函数赋值给变量以及在表中存储。同时,讨论了非全局函数的使用,并详细解释了词法定界原则,通过例子说明了闭包的概念,强调了每个闭包都有独立的局部变量环境。此外,还通过newCounter函数创建闭包的例子展示了计数器的实现。
摘要由CSDN通过智能技术生成

    在Lua语言中,函数是严格遵循词法定界的第一类值。

  1  函数是第一类值

function foo(x) return 2*x end
----等价于
foo = function(x) return 2*x end
a = {p = print}       --  'a.p'指向'print'函数
a.p("Hello World")    --> Hello World
print = math.sin      --  print现在指向sine函数
a.p(print(1))         --> 0.8414709848097
math.sin = a.p        --  'sin'现在指向print函数
math.sin = (10,20)    --> 10  20

2  非全局函数

    函数不仅可以被存储在全局变量中,还可以被存储在表字段和局部变量中。

    存储在表中:

Lib = {
    foo = function (x,y) return x + y end
    goo = function (x,y) return x - y end
}

    存储在局部变量中:

local function f (params)
    body
end

3  词法定界

    当编写一个被其他函数B包含的函数A时,被包含的函数A可以访问包含其的函数B的所有变量,这种特性称为词法定界

    闭包:一个函数外加能够使该函数正确访问非局部变量所需的其他机制。

    如下方代码:c1和c2是不同的闭包。他们建立在相同的函数之上,但是各自拥有局部变量count的独立实例。

function newCounter ()
    local count = 0
    return function ()
        count = count + 1
        return count
    end
end

c1 = newCounter()
print(c1())        --> 1
print(c1())        --> 2
c2 = newCounter()
print(c2())        --> 1
print(c1())        --> 3
print(c2())        --> 2                 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值