您的位置:首页 > 移动开发 > Unity3D

[Unity热更新]lua基础(五)

2016-04-04 17:44 495 查看
十一.错误处理

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