算來lua腳本的使用也有一年了,記錄一些在項目使用過程當中碰到的雷點,沒注意的話就容易踩坑。c++
1.迭代器 pairs ipairs面試
ipairs 有序遍歷,適用於數組數組
local tab = {1,2,3,4,5,6}函數
for i,v in ipairs(tab) thenlua
print(v)排序
endthree
輸出:1 2 3 4 5 6 ip
注意:遍歷到nil就會中止遍歷io
local tab_2 = {1,2,3,nil,5,6}table
for i,v in ipairs(tab_2) then
print(v)
end
輸出:1 2 3
pairs 無序遍歷,適用於鍵值對
local tab = {
[one] = 1,
[two] = 2,
[three] = 3
}
for k,v in (tab) then
print(v)
end
輸出:不肯定(由於遍歷順序不肯定)
2.table.sort()
table.sort是排序函數,它要求排序的目標table必須是從1到n連續的數組,即中間不能有nil
table.sort默認按照升序排序;當額外寫了比較函數時,至關於你重載了lua中自帶的「<」操做符。這就有一個特別要注意的問題,當兩個數相等的時候,比較函數必定要返回false!
a = 5;
b = 5;
c = 5;
d = {a, b, c};
table.sort(d,function(first,senond)
if first < second then
return true;
end
if first > second then
return false;
end
return true;
)
上面那段代碼一執行就會報錯了,緣由就在於最後的一個true。比較函數執行時,a==b,返回true;b==c,返回true;c==a,返回true。可是,咱們所寫的比較函數其實是重載了「小於號」操做符,因此程序執行後的結果就是a<b,b<c,c<a,此時就會出問題!
這裏我犯過一個錯誤就是在重寫比較函數的時候將「<」號重載爲「>=」,返回爲true。即,table.sort(d,function(first,second)
return first >= second
end)
這樣即便程序執行不報錯,當first == second獲得的排序結果也不會如咱們預期的想象。
3.值類型 / 引用類型
這個是腳本語言反覆強調的重點,也是面試必考的知識點,可是當我在處理一個比較複雜的界面運算邏輯的時候仍是不可避免的踩了坑。關於這塊網上已經有不少定義上的解釋,這裏咱們直接上例子。
值類型:
local a = 3
local b = a
a = a + 1 //這裏強調下lua語言當中並無c++等語言當中的自增自減符號
print(b)
輸出:3
引用類型:
local tab_3 = {1,2,3}
local tab_4 = tab_3
local tab_5 = {}
for i,v in(tab_3) do
{
table.insert(tab_5,v)
}
tab_3[2] = 5 //lua數組的下標從1開始
for i,v in(tab_4) do
{
print(v)
}
for i,v in(tab_5) do
{
print(v)
}
輸出:1 5 3
1 2 3
咱們重點解釋下爲何tab_5沒有隨着tab_3的改變而改變,由於tab_5是從新聲明插入數值的表,在堆中開闢了一塊新的地址空間,是獨立於tab_3的新表。tab_4是在棧中對tab_3的引用,與tab_3擁有同樣的尋址空間。