热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

lua学习笔记之闭包

Lua中的函数是具有适当词法范围的一级值。lua作为一级值意味着函数与数字和字符串一样具有值,可以将函数存储在变量或者表中,将函数作为参数传递给其它函

Lua中的函数是具有适当词法范围的一级值。

lua作为一级值意味着函数与数字和字符串一样具有值,可以将函数存储在变量或者表中,将函数作为参数传递给其它函数,也可以作为结果返回函数。

lua具有词法范围意味着函数可以访问闭包函数的变量。

表排序table.sort。

network = {{name = "grauna", IP = "210.26.30.34"},{name = "arraial", IP = "210.26.30.23"},{name = "lua", IP = "210.26.23.12"},{name = "derain", IP = "210.26.23.20"}
}table.sort(network, function (a, b) return (a.name > b.name) end)
for k, v in pairs(network) dofor k, v in pairs(v) doprint(k, v)end
end

1、函数作为一类值

以函数作为参数的函数称为高阶函数,如table.sort。高阶函数没有特权,因为lua将函数视为一类值。

function derivative(f, delta)delta = delta or 1e-4return function (x)return (f(x + delta) - f(x)) / deltaend
endc = derivative(math.sin)
print(math.cos(5.2), c(5.2))

2、非全局函数

函数作为一类值,可以在全局变量中存储,也可以在表字段里或者局部变量里存储。

表中函数定义

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

也可在构造中定义

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

也可以定义如下

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

局部函数定义形式如下:

local function f(params)body
end或者
local f
f = function(params) body end

正确的局部递归函数为

local fact
fact = function(n)if n == 0 then return 1else return n * fact(n - 1)end
endprint(fact(2))

在间接型的局部递归函数时,需要使用前向声明。

local flocal function g() return f()
endfunction f() end

3、词法作用域

当函数中嵌套函数时,嵌套函数可以访问函数中的本地变量。

names = {"Peter", "Paul", "Mary"}
grades = {Mary = 10, Paul = 7, Peter = 8}
--table.sort(names, function (n1, n2) return grades[n1] > grades[n2] end)
function sortbygrade(names, grades)table.sort(names, function(n1, n2) return grades[n1] > grades[n2] end)
endsortbygrade(names, grades)
for i = 1, #names doprint(names[i])
end

function newCounter()local count = 0return function()count = count + 1return countend
endc1 = newCounter()
print(c1())
print(c1())

输出为

 


推荐阅读
author-avatar
Kevinczp
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有