lua中設定唯讀table

2021-06-18 04:52:44 字數 738 閱讀 8912

c++裡有const用來定義常量,保護引數或函式意外地修改,提高程式的健壯性。在lua裡雖然沒有沒有類似的關鍵字,我們可以用表來模擬實現其唯讀的功能,來保護我們的資料被意義地修改。

lua 裡有乙個__index metamethod,當我們訪問乙個表不存在的域時,會觸發lua直譯器去查詢__index metamethod: 如果不存在,返回結果nil,如果存在,則由__index metamethod返回結果。

__newindex metamethod 是用來對錶進行更新,當你給乙個表缺少的域賦值,直譯器就會查詢__newindex metamethod,如果存在則呼叫這個函式,而不進行賦值操作。另外有乙個 raw metamethod可經繞過__newindex metamethod。

我只須重寫:__index metamethod 和__newindex metamethod 便可達到讓表唯讀的目的。

**如下:

function table_read_only(t)

local temp= t or {} 

local mt =

setmetatable(temp, mt) 

return temp

end用法:

local t_a =

local t_b = table_read_only( t_a) --t_b為唯讀

t_b[5] = 1 --對錶進行更新,會報錯:attempt to update a read-only table!

Lua設定唯讀表

簡單理解一下 在lua中,當你從乙個table中查詢值的時候,實際上是lua直譯器觸發了 index 而當你賦值時,則是訪問了 newindex 如果 newindex存在就會呼叫這個函式,而不進行賦值。所以重寫這兩個函式就可以達到唯讀表的效果 function table read only t ...

lua遍歷table中刪除table中元素

很多時候,我們有這樣的需求 刪除table中若干符合條件的元素,最原始的想法就是用for遍歷一邊table,符合條件的用table.remove就可以了 function test1 t for i v in ipairs t do if v.id 3 0 then table.remove t i...

lua中求table長度

關於lua table介紹,看以前的文章 官方文件是這麼描述 的 取長度操作符寫作一元操作 字串的長度是它的位元組數 就是以乙個字元乙個位元組計算的字串長度 tablet的長度被定義成乙個整數下標n。它滿足t n 不是nil而t n 1 為nil 此外,如果t 1 為nil,n就可能是零。對於常規的...