最近在專案中遇到框架上設計的lua唯讀表,在使用next對錶判空時出現一直為nil的情況,後來研究了下唯讀表的生成,特此記錄。
-- lua唯讀表的生成**
xreadonlytable.create =
function
(t)for x, y in
pairs
(t)do
iftype
(x)==
"table"
then
iftype
(y)==
"table"
then
t[xreadonlytable.
create
(x)]
= xreadonlytable.
create
(y)else
t[xreadonlytable.
create
(x)]
= y end
elseif
type
(y)==
"table"
then
t[x]
= xreadonlytable.
create
(y)end
endlocal mt =
return
setmetatable
(, mt)
-- 返回乙個空表
end
-- 測試**
function
test()
local tablea =
local tableb = xreadonlytable.
create
(tablea)
xlog.
debug
(next
(tableb)
) xlog.
debug
(tablea[1]
)end
-- 列印
nil1
**中可以看出,生成唯讀表的時候返回了乙個空表,也就是說tableb是個帶有自己設定好特殊原表的空表,在使用next呼叫tableb的時候,也是呼叫的這個空表,所以返回的是nil。
而按照索引對錶進行訪問的時候,由於訪問空表找不到元素值,就去訪問原表,找到了帶有資料的tablea,返回指定索引資料。
在日後對錶判空還是建議使用next,對於專案內自定義的唯讀表還要多加注意。
Lua設定唯讀表
簡單理解一下 在lua中,當你從乙個table中查詢值的時候,實際上是lua直譯器觸發了 index 而當你賦值時,則是訪問了 newindex 如果 newindex存在就會呼叫這個函式,而不進行賦值。所以重寫這兩個函式就可以達到唯讀表的效果 function table read only t ...
Lua簡單使用,lua工具類編寫,lua表的使用
專案中的工具類編寫,以utils.lua為例 首先建立乙個表。utils utils or 尋找陣列中某個值的下標 utils utils or 尋找陣列中某個值的下標,僅在table中每個值都不一樣時有效 utils.findidxbyvalue function arr,value local ...
lua 使用lua next 遍歷表
進行下面步驟前先將 table 壓入棧頂 intnindex lua gettop plua 取 table 索引值 lua pushnil plua nil 入棧作為初始 key while 0 lua next plua,nindex 現在棧頂是 table lua next 這個函式的工作過程...