作者:Kevinczp | 来源:互联网 | 2023-10-12 11:02
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())
输出为