好贷网好贷款

Lua学习笔记之二(函数和迭代器)

发布时间:2016-12-4 12:04:35 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"Lua学习笔记之二(函数和迭代器)",主要涉及到Lua学习笔记之二(函数和迭代器)方面的内容,对于Lua学习笔记之二(函数和迭代器)感兴趣的同学可以参考一下。

好不容易看到函数和迭代器了。对于函数来说,Lua可以利用同时返回多个值,并且还可以创建闭包(closure)。Lua对可变参数函数的支持用起来也很方便,只是对于迭代器的使用,尤其是无状态迭代器,暂时还没有看明白,先歇一会: -- 局部函数 local function max( a, b ) return (a>b) and a or b end print(max(23, 34)) -- 全局函数, 前提是不存在一个叫min的局部变量,如下 -- local min function min( a, b ) return (a > b) and b or a end print(min(35, 90)) -- 还可以定义匿名函数 local say = function ( x ) print(x) end say("hello, world!") -- 多个返回值的函数 function maxmin( a, b ) if a < b then return b, a else return a, b end end print(maxmin(390, 88)) -- 可变参数 function id( ... ) return ... end print(id(1, 2, 3, 4, 5, 6)) -- table, 可变的引用类型, 元素的值不能包含nil tab = {} -- 创建table tab["x"] = 5 print(tab["x"]) local array = {} for i=1,10 do array[i] = math.random(100) end for i=1,10 do print(array[i]) end -- #array 得到table里的元素个数 print(#array) -- 删除最后一个元素 array[#array] = nil print(#array) -- 添加元素 array[#array + 1] = "123" print(#array) -- table的下标从1开始 array2 = { 1, 2, 3, 4, 5, 6 } table.insert(array2, 3, 9) for i=1,7 do print(array2[i]) end local function print_array( array ) for i=1,#array do print(array[i]) end end print_array(array2) -- 排序 table.sort(array2) print("----------") print_array(array2) -- 连接数组元素 print(table.concat(array2, ", ")) -- 使用ipairs函数遍历table for i,v in ipairs(array2) do print(i,v) end print("----------") -- ipairs确保迭代顺序,pairs并不保证迭代顺序 for k,v in pairs(array2) do print(k,v) end -- 多维数组 local mt = {} for i=1,10 do mt[i] = {} for j=1,5 do mt[i][j] = i * j end end print("-----------") -- 记录,类似于结构体或者类,可以使用点操作符(.)访问成员 point1 = { x = 10, y = 20 } print(point1.x, point1.y) print(point1["x"], point1["y"]) -- 集合,将table中的key看作集合的元素,而value全部为true -- 当然,也可以将value作为计数器,表示元素的个数 local set = { [math.random(10)] = true, [math.random(10)] = true, [math.random(10)] = true } for k,v in pairs(set) do print(k, v) end sunday = "monday"; monday = "sunday" -- [sunday]取的是变量sunday的值作为key t = { sunday = "monday", [sunday] = monday } print(t.sunday, t[sunday], t[t.sunday]) -- 看一看可变参数的函数 function add( ... ) local sum = 1 for _,v in ipairs({...}) do sum = sum + v end return sum end print(add(1, 2, 3, 4)) -- 如果中间有nil值,则需要调用table.pack()函数 t = table.pack(1, nil, 2) for i=1,t.n do print(t[i]) end print(table.unpack(t)) -- 还可以指定起始位置 print(table.unpack(t, 1, 2)) function test( args ) print(args.new, args.old) end -- 调用函数可以省略圆括号 test { new = "new", old = "old" } test({new = "new1", old = "old1"}) -- 函数参数的作用域在函数里面有效,包括在函数里定义的匿名函数内 function derivative( f, dx ) dx = dx or 1e-4 return function ( x ) -- f和dx的作用域 return (f(x + dx) - f(x)) / dx end end function line( x ) return 4 * x + 9 end slope = derivative(line, 89) print(slope(12)) -- 闭包(closure),能够保存状态值,比如x的值在每次调用都会保存结果 function closureTest( x ) return function ( y ) x = x + y return x end end print("-----------------") test = closureTest(1) print(test(1)) print(test(2)) print(test(3)) -- 回调函数 a = { 2, 4, 9, 3, 0, 6 } table.sort(a, function ( a, b ) return a < b end) print_array(a) for line in io.lines("function.lua") do for word in string.gmatch(line, "%w+") do print(word) end end -- 迭代器 iter = function () local x = math.random(4) if x == 4 then return nil else return x end end for n in iter do print(n) end -- 闭包迭代器 function fromto( a, b ) return function ( ) if a > b then return nil else a = a + 1 return a - 1 end end end for i in fromto(2, 5) do print(i) end print(fromto(1, 2)) print(ipairs{1, 2, 3, 4, 5}) -- 无状态迭代器 function fromto2( a, b ) return function ( state, seed ) if seed >= state then return nil else return seed + 1 end end, b, a-1 end for i in fromto2(1, 5) do print(i) end

上一篇:解读jeebbs(1)部署
下一篇:设计模式(22)——解释器模式

相关文章

相关评论