Lua 一些常用方法的区别

  • ipairs 和 pairs的区别

pairs遍历表中全部key,value

ipairs从下标为1开始遍历,然后下标累加1,如果某个下标元素不存在就终止遍历。这就导致如果下标不连续或者不是从1开始的表就会中断或者遍历不到元素。

a={[1]="a",[2]="b",[3]="c",[4]="d",[5]="e"};

for k,v in ipairs(a) do
print(k,v);
end

print("--------------")

for k,v in pairs(a) do
    print(k,v)
end

输出结果

1   a
2   b
3   c
4   d
5   e
--------------
2   b
3   c
1   a
4   d
5   e
  • 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
mytable = setmetatable({key1 = "value1"}, {
  __newindex = function(mytable, key, value)
        rawset(mytable, key, "\""..value.."\"")

  end
})

mytable.key1 = "new value"
mytable.key2 = 4

print(mytable.key1,mytable.key2)       -->new value "4"

pcall & xpcall(发生错误时不会中断程序) aseert & error (发生错误时会中断程序)

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 进行错误处理  
--assert

local function add(a,b)
   assert(type(a) == "number", "a 不是一个数字")
   assert(type(b) == "number", "b 不是一个数字")
   return a+b
end
add(10)

功能:终止正在执行的函数,并返回message的内容作为错误信息(error函数永远都不会返回)通常情况下,error会附加一些错误位置的信息到message头部。

Level参数指示获得错误的位置:

Level=1[默认]:为调用error位置(文件+行号)

Level=2:指出哪个调用error的函数的函数

Level=0:不添加错误位置信息

--error

error (message [, level])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值