[Unity热更新]lua基础(五)
2016-04-04 17:44
495 查看
十一.错误处理
1.assert(发生错误时会中断程序)
2.pcall & xpcall(发生错误时不会中断程序)
十二.rawget & rawset
那么,一个不错的方法就是:
看到这里,你或许会有疑惑,因为:
对table中不存在的key进行操作是可以的,而上面所说的__index,__newindex,rawget,rawset都是针对类来说的,这里setmetatable就可以看作表和类的一个区分了
十三.点号与冒号的区别
a = { x = 1 }
function a.fun(self)
print(self.x);
end
--结论: a.fun(self) = a:fun()
a.fun(a); --1
a:fun(); --1
----------------------------------------------
function a:fun(arg1, arg2)
print(self.x .. arg1 .. arg2);
end
a.fun(a, 2, 3); --123
a:fun(2, 3); --123
a.fun(2, 3); --报错
1.assert(发生错误时会中断程序)
--如果第一个参数为false,则输出第二个参数(即错误信息) --assert(1 < 0, "a error!!")--发生错误,错误信息为a error!! --如果第一个参数为true,则输出true和错误信息 local a,b = assert(1 > 0,"错误信息!!") print(a);--true print(b);--错误信息!!
2.pcall & xpcall(发生错误时不会中断程序)
--pcall,即protected call,作用类似与try catch function A(i) print(i); end function B(i) print(i); error("a error!!"); end --pcall,第一个是函数,然后是该函数的参数 --true表示执行后没错误,否则有错误 print(pcall(A,33));--33 true print(pcall(B,34));--34 false ------------------------------------------ print("-----------"); function C() print("进行错误处理"); end --xpcall,第一个是函数,然后是错误处理函数 xpcall(A,C);--nil xpcall(B,C);--nil 进行错误处理
十二.rawget & rawset
--rawget(table,key),作用是可以绕过__index --rawset(table,key,value),作用是可以绕过__newindex Window = {x = 0, y = 0, width = 100, height = 100} setmetatable(Window, Window); --对不存在的key进行获取时,就会触发__index Window.__index = function (t, k) return 1000; end --对不存在的key进行赋值时,就会触发__newindex Window.__newindex = function (t, k, v) print("no!") end ----rawget print(Window.a);--1000,因为使用了__index print(rawget(Window, a));--nil --rawset Window.b = 1;--no! print(Window.b);--1000 rawset(Window, "b", 500); print(Window.b);--500
那么,一个不错的方法就是:
Window.__newindex = function (t, k, v) rawset(Window, k, v); end而Window.__newindex = function (t, k, v) Window.k = v; end 这种写法是会报错的
看到这里,你或许会有疑惑,因为:
Window = {x = 0, y = 0, width = 100, height = 100} print(Window.a);--nil Window.b = 50 print(Window.b);--50
对table中不存在的key进行操作是可以的,而上面所说的__index,__newindex,rawget,rawset都是针对类来说的,这里setmetatable就可以看作表和类的一个区分了
十三.点号与冒号的区别
a = { x = 1 }
function a.fun(self)
print(self.x);
end
--结论: a.fun(self) = a:fun()
a.fun(a); --1
a:fun(); --1
----------------------------------------------
function a:fun(arg1, arg2)
print(self.x .. arg1 .. arg2);
end
a.fun(a, 2, 3); --123
a:fun(2, 3); --123
a.fun(2, 3); --报错
相关文章推荐
- 详解Lua中的表的概念及其相关操作方法
- Lua编程示例(二):面向对象、metatable对表进行扩展
- 把Lua编译进nginx步骤方法
- Lua脚本自动生成APK包
- Lua中的元表(metatable)、元方法(metamethod)详解
- Lua中的metatable介绍
- Lua中ipair和pair的区别
- Lua中的函数精讲笔记
- 浅谈Lua的面向对象特性
- 详解Lua中的变量相关知识点
- Lua脚本语言入门笔记
- Lua脚本调用外部脚本
- 详解Lua中的if语句的使用方法
- Lua中调用函数使用点号和冒号的区别
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中强大的元方法__index详解
- Lua中调用C++函数示例
- Lua面向对象之类和继承浅析
- Lua性能优化技巧(一):前言
- Lua中获取table长度问题探讨