Lua查找一個表元素時的規(guī)則,其實就是如下3個步驟:
1.在表中查找,如果找到,返回該元素,找不到則繼續(xù)
2.判斷該表是否有元表,如果沒有元表,返回nil,有元表則繼續(xù)。
3.判斷元表有沒有__index方法,如果__index方法為nil,則返回nil;如果__index方法是一個表,則重復(fù)1、2、3;如果__index方法是一個函數(shù),則返回該函數(shù)的返回值。
__newindex 元方法用來對表更新,__index則用來對表訪問 。當(dāng)你給表的一個缺少的索引賦值,解釋器就會查找__newindex 元方法:如果存在則調(diào)用這個函數(shù)而不進(jìn)行賦值操作。使用 rawset 函數(shù)來更新表:mytable = setmetatable({key1 = "value1"}, { __newindex = function(mytable, key, value)????????rawset(mytable, key, "\""..value.."\"") end})mytable.key1 = "new value"mytable.key2 = 4print(mytable.key1,mytable.key2);輸出new value????"4"
表的元方法:
__index ;__newindex ;__add?對應(yīng)的運算符?+ ;__sub?對應(yīng)的運算符?- ;__mul對應(yīng)的運算符?* ;__div對應(yīng)的運算符 '/';__mod對應(yīng)的運算符 '%';__unm對應(yīng)的運算符 '-';__concat對應(yīng)的運算符 '..';__eq對應(yīng)的運算符 '==';__lt對應(yīng)的運算符 '<';__le對應(yīng)的運算符 '<=';__call ;__tostring ;
自定義迭代函數(shù),Lua提供了pairs(全部遍歷)和ipairs(從1開始遍歷,當(dāng)下標(biāo)不連續(xù)時或者結(jié)束時中斷遍歷):
for 變量列表 in 迭代函數(shù) , 狀態(tài)變量 ,控制變量 do? 循環(huán)體 end? ?①:調(diào)用迭代函數(shù),把狀態(tài)變量和控制變量當(dāng)成參數(shù)傳遞給迭代函數(shù),狀態(tài)變量只會在第一次給迭代函數(shù)賦值,狀態(tài)變量表示結(jié)束迭代函數(shù)的條件,控制變量表示每次迭代變換,就會增加或者減少.②迭代函數(shù)如果返回nil,則退出for循環(huán),如果不是nil,把返回值賦值給變量列表,并執(zhí)行循環(huán)體,一般是返回2個值.
函數(shù)體 function square(state,control) if (control>state) then return nil else control = control+1 return control,control*control end end? ? ? ? ? ? ? ? ? ? ? 循環(huán)體:for i,j in square ,3,0 do print(i,j) end 結(jié)果 1,1? ? 2,4? 3,9