lua总结
来源:互联网 发布:js截取字符串的方法 编辑:程序博客网 时间:2024/05/01 21:29
第一章基础用法
1.1全局函数
在某一个模块中的函数,如果该模块要被其他模块使用,则该模块中的函数不能定义为local的。
1.2可变参数
Lua 函数可以接受可变数目的参数,和 C 语言类似在函数参数列表中使用三点(…),表示函数有可变的参数。Lua 将函数的参数放在一个叫 arg 的表中,除了参数以外,arg表中还有一个域 n 表示参数的个数。
function fun(...) print(#arg, arg[1])--此处打印出1 10endfun(10)
第二章元表与元方法
2.1__index
Window.mt.__index = function (table, key) return Window.prototype[key]end--调用print(w.width)--w中没有width域
当__index等于函数时,Lua 使用w(the table)和 width(缺少的值)来调用__index metamethod。Lua 将 table 和缺少的域作为参数调用这个函数。
2.2__call
__call(a, …) 对应表达式 a(…)
2.3__gc
Lua中的垃圾回收主要是针对Lua对象,但是也可以做一些额外的资源管理工作。
可以为表设定垃圾收集的元方法(对于完全用户数据,则需要使用C API),该元方法称为 终结器。Lua用”__gc” 元方法实现终结器:
o = {x = "hi" }setmetatable(o , {__gc = function (o ) print (o.x) end } )o = nilcollectgarbage() --> hi -- 触发元方法__gc
如果我们没有对对象进行__gc标记,它就不会终结。
在它之后才给元表加上这个__gc域,那么这个对象是没有被标记需要触发终结器的:
o = { x = "hi"}mt = {}setmetatable(o,mt )mt.__gc = function(o) print(o.x) endo = nilcollectgarbage() --> 不会打印任何东西
在标记__gc域后,还是可以自由地改变其元表中的 “__gc” 域:
o = {x = "hi" }mt = {__gc = true } --先用任何值给它赋值,作为占位符setmetatable(o, mt )mt.__gc = function(o) print (o.x) end --再次修改,也是可以的o = nilcollectgarbage() --> hi
当用同一个循环对几个对象进行垃圾回收,调用终结器的顺序和标记对象__gc域的顺序刚好相反。
mt = { __gc = function (o) print (o[1]) end }list = nilfor i = 1, 3 do list = setmetatable({i , link = list}, mt )endlist = nilcollectgarbage()--> 3--> 2 --> 1
第三章面相对象编成
3.1多重继承
local function search (k, plist) for i=1, table.getn(plist) do local v = plist[i][k] if v then return v end endendfunction createClass (...) local c = {} --c的metatable是一个表,该表的__index是一个函数,该函数去查找父类 setmetatable(c, {__index = function (table, k) return search(k, arg) end}) c.__index = c function c:new (o)--c是new出的子类的metatable o = o or {} setmetatable(o, c) return o end return cendNamed = {}function Named:getname () return self.nameendfunction Named:setname (n) self.name = nendAcount = { value = 10, withdraw = function(self, v) self.value = v end}NamedAccount = createClass(Account, Named)--子类account = NamedAccount:new{name = "Paul"}--account是一个实例print(account:getname()) --> Paul
现在我们看看上面最后一句发生了什么,Lua 在 account 中找不到 getname,因此他查找 account 的 metatable 的__index,即NamedAccount。但是,NamedAccount 也没有getname,因此 Lua 查找 NamedAccount 的 metatable 的__index,因为这个域包含一个函数,Lua 调用这个函数并首先到 Account 中查找 getname,没有找到,然后到 Named 中查找,找到并返回最终的结果。当然,由于搜索的复杂性,多重继承的效率比起单继承要低。
第四章库的使用
4.1encode and decode
json.encode将表格数据编码为 JSON 字符串。格式:jsonString = json.encode(表格对象)用法示例:local str = json.encode({a=1,b="ss",c={c1=1,c2=2},d={10,11},100})echo(str) -- {"a":1,"b":"ss","c":{"c1":1,"c2":2},"d":[10,11],"1":100}local str = json.encode({1,2,"3",{10,11}})echo(str) -- [1,2,"3",[10,11]]Note: table作为字典使用时,整型键值将被转换为字符串键值local str = json.encode({a=1,[5]=3})echo(str) -- {"a":1,"5":3}Note: table所有键值为整型时,会当作数组看待,空位将转化为nulllocal str = json.encode({[3]=2,[5]=3})echo(str) -- [null,null,2,null,3]~~json.decode将 JSON 字符串解码为表格对象。格式:table = json.decode(string)用法示例:local json = require("framework.shared.json")local tb = json.decode('{"a":1,"b":"ss","c":{"c1":1,"c2":2},"d":[10,11],"1":100}')dump(tb) --[[- "<var>" = {- "1" = 100- "a" = 1- "b" = "ss"- "c" = {- "c1" = 1- "c2" = 2- }- "d" = {- 1 = 10- 2 = 11- }- }]]local tb = json.decode('[1,2,"3",[10,11]]')dump(tb) --[[- "<var>" = {- 1 = 1- 2 = 2- 3 = "3"- 4 = {- 1 = 10- 2 = 11- }- }]]
……待更新
- Lua总结
- lua总结
- lua总结
- Lua总结
- lua迭代总结
- LUA学习总结
- lua编译问题总结
- Lua词法分析总结
- Lua基础总结
- lua错误总结
- Lua基本语法总结
- Lua 字符串库函数总结
- Lua 字符串库函数总结
- lua学习总结
- Lua入门总结
- lua基本库函数总结
- Lua总结一
- Lua总结二
- Linux内核Socket CAN中文文档
- 学会java自定义annotation
- 支付宝
- react-native自定义控件怎么实现屏幕宽度的80%
- 第十一周 项目1(1) 层次遍历算法的验证
- lua总结
- IOS print NSLog 格式化
- 第十一周项目1-验证算法(1)-层次遍历算法的验证
- 第十一周项目1——二叉树算法验证(1) 层次遍历算法验证
- JavaScript中方法参数为URL处理办法
- 【第十一周项目1 - 二叉树算法验证(1)】
- NOIP 2014 - 提高组 寻找道路
- DOM4J方式解析、创建XML文件(实例)
- PowerSinger之Java环境配制