亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Lua中設置table為只讀屬性的方法詳解

2024-07-21 23:05:03
字體:
來源:轉載
供稿:網友

項目中部分只讀表易被人誤改寫,故決定在非線上環境里對這些表附加只讀屬性,方便在出現誤改寫的時候拋出lua/269325.html">lua錯誤,最終版代碼如下:

--[[-------------------------------------------------------------------------------** 設置table只讀 出現改寫會拋出lua error-- 用法 local cfg_proxy = read_only(cfg) retur cfg_proxy-- 增加了防重置設置read_only的機制-- lua5.3支持 1)table庫支持調用元方法,所以table.remove table.insert 也會拋出錯誤,--  2)不用定義__ipairs 5.3 ipairs迭代器支持訪問元方法__index,pairs迭代器next不支持故需要元方法__pairs-- 低版本lua此函數不能完全按照預期工作*]]function read_only(inputTable) local travelled_tables = {} local function __read_only(tbl) if not travelled_tables[tbl] then  local tbl_mt = getmetatable(tbl)  if not tbl_mt then  tbl_mt = {}  setmetatable(tbl, tbl_mt)  end  local proxy = tbl_mt.__read_only_proxy  if not proxy then  proxy = {}  tbl_mt.__read_only_proxy = proxy  local proxy_mt = {   __index = tbl,   __newindex = function (t, k, v) error("error write to a read-only table with key = " .. tostring(k)) end,   __pairs = function (t) return pairs(tbl) end,   -- __ipairs = function (t) return ipairs(tbl) end, 5.3版本不需要此方法   __len = function (t) return #tbl end,   __read_only_proxy = proxy  }  setmetatable(proxy, proxy_mt)  end  travelled_tables[tbl] = proxy  for k, v in pairs(tbl) do  if type(v) == "table" then   tbl[k] = __read_only(v)  end  end end return travelled_tables[tbl] end return __read_only(inputTable)end

測試代碼如下:

local t0 = {k = 1}local t2 = { fdsf = {456}}local t1 = {  a = {456, 89},  b = {456,ddss = 9, t2 = t2},  d = 45,  e = "string",}t1.c=t1local t3 = read_only(t1)print(t3.d, t3.c.e, t3.c.c.b.t2.fdsf)function q1() t3.d = 4555 endfunction q2() t3.c.d = 90 endfunction q3() t3.c.c.b.t2.fdsf =90 endfunction q4() table.remove(t3.a) endfunction q5() t3.b[ddss] = nil endfunction q6() t3[f] = 89 endfunction q7() table.insert(t3.a, 999) endprint(pcall(q1))print(pcall(q2))print(pcall(q3))print(pcall(q4))print(pcall(q5))print(pcall(q6))print(pcall(q7))print(t3.a[1])for k,v in pairs(t3) do print("===pairs t3:",k,v)endfor k,v in pairs(t3.a) do print("===pairs t3.a:",k,v)endfor k,v in ipairs(t3) do print("===ipairs t3:",k,v)endfor k,v in ipairs(t3.a) do print("===ipair t3.a",k,v)endprint("len t3:",#t3)print("len t3.a:", #t3.a)local t4 = read_only(t2)local t5 = read_only(t0)local t6 = read_only(t0)print(t3.b.t2, read_only(t2))print(t5, t6, t0)

測試環境https://www.lua.org/cgi-bin/demo  lua5.3.4:

string table: 0x20d4ba0false input:17: error write to a read-only table with key = dfalse input:17: error write to a read-only table with key = dfalse input:17: error write to a read-only table with key = fdsffalse input:17: error write to a read-only table with key = 2false input:17: error write to a read-only table with key = nilfalse input:17: error write to a read-only table with key = nilfalse input:17: error write to a read-only table with key = 3===pairs t3: e string===pairs t3: b table: 0x20ccd60===pairs t3: a table: 0x20d4e70===pairs t3: d 45===pairs t3: c table: 0x20ca700===pairs t3.a: 1 456===pairs t3.a: 2 89===ipair t3.a 1 456===ipair t3.a 2 89len t3: 0len t3.a: 2table: 0x20d4870 table: 0x20d4870table: 0x20d5690 table: 0x20d5690 table: 0x20d1140

代碼思路設計:

1.使用proxy={}空表而不是目標表tbl來設置__newindex是因為__newindex必須在原表里面不存在才會調用,這樣就依然可以對已存在的字段進行改寫

__newindex: The indexing assignment table[key] = value. Like the index event, this event happens when table is not a table or when key is not present in table. The metamethod is looked up in table.Like with indexing, the metamethod for this event can be either a function or a table. If it is a function, it is called with table, key, and value as arguments. If it is a table, Lua does an indexing assignment to this table with the same key and value. (This assignment is regular, not raw, and therefore can trigger another metamethod.)Whenever there is a __newindex metamethod, Lua does not perform the primitive assignment. (If necessary, the metamethod itself can call rawset to do the assignment.)

2.避免出現table的互相引用,加入travelled_tables存儲已經設置過proxy的table的映射

3.對于原表tbl的訪問使用__index=tbl

4.對于表查長度使用__len= function () return #tbl end

5.對于遍歷pairs,查到lua5.3的pairs默認迭代器next不支持訪問元表__index,故直接__pairs = function () return pairs(tbl) end,以此來生成對目標表的迭代遍歷

6.對于ipairs,查到lua5.3 ipairs函數生成的迭代器默認就支持訪問元表__index,故不需要添加__ipairs

     8.2 – Changes in the Libraries

     •The ipairs iterator now respects metamethods and its __ipairs metamethod has been deprecated.

7.對于table.insert , table.remove不用特殊處理,lua5.3的table lib支持元表操作,故依然會拋錯

      8.2 – Changes in the Libraries

      •The Table library now respects metamethods for setting and getting elements.

8.避免重復創建read_only,每個tbl只創建一個proxy代理,在tbl的metatable里和proxy的metatable里都設置屬性__read_only_proxy,可以直接訪問獲得

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到lua頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲伦理中文字幕| 91沈先生作品| 高跟丝袜欧美一区| 欧美精品亚州精品| 在线视频欧美日韩精品| 亚洲一区www| 国产精品久久久久av| 亚洲九九九在线观看| 欧美性生活大片免费观看网址| 久久精品亚洲国产| 久久影院资源站| 色yeye香蕉凹凸一区二区av| 欧美国产日韩在线| 欧美激情一区二区三区久久久| 亚洲一区二区久久久久久| 日韩av网址在线| 亚洲91精品在线观看| 久久好看免费视频| 欧美日韩国产999| 日韩毛片在线看| 在线视频欧美性高潮| 性欧美亚洲xxxx乳在线观看| www.日韩.com| 国内精品中文字幕| 免费av在线一区| 国产女人精品视频| 欧美精品18videosex性欧美| 欧美国产高跟鞋裸体秀xxxhd| 91精品国产免费久久久久久| 久久99亚洲精品| 日韩电影免费观看中文字幕| 中文字幕欧美亚洲| 97在线视频免费看| 日韩成人免费视频| 最近2019年日本中文免费字幕| 国产精品扒开腿做爽爽爽的视频| 欧美日韩精品在线观看| 国产精品久久久久久久久久新婚| 亚洲成人网久久久| 日韩欧美国产高清91| 91久久国产综合久久91精品网站| 97热在线精品视频在线观看| 91免费福利视频| 91wwwcom在线观看| 成人福利网站在线观看| 亚洲欧美日韩一区二区三区在线| 国产精品福利无圣光在线一区| 久久偷看各类女兵18女厕嘘嘘| 91高清免费在线观看| 亚洲精品自在久久| 亚洲日韩中文字幕| 91久久夜色精品国产网站| 亚洲自拍偷拍色图| 欧美日韩美女视频| 在线观看不卡av| 亚洲精品中文字幕有码专区| 国产精品第一视频| 97视频免费在线观看| 国产97在线播放| 精品中文视频在线| 91精品国产91久久久久| 国产va免费精品高清在线| 欧美电影免费在线观看| 国模精品一区二区三区色天香| 亚洲欧美福利视频| 欧美激情区在线播放| 国产精品白嫩初高中害羞小美女| 91网站免费看| 国产精品第一视频| 一区三区二区视频| 亚洲欧美日韩中文在线制服| 亚洲成人av资源网| 久久久爽爽爽美女图片| 亚洲精品中文字幕av| 日本精品一区二区三区在线| 日韩一区视频在线| 中文.日本.精品| 久久伊人精品天天| 欧美日韩美女在线观看| 欧美激情亚洲国产| 欧美日韩一区二区三区| 日韩激情视频在线播放| 日韩电影中文字幕| 亚洲在线一区二区| 欧美—级a级欧美特级ar全黄| 日韩人体视频一二区| 国产精品美乳一区二区免费| 国产精品视频久久久| 亚洲国产精品成人一区二区| 在线精品高清中文字幕| 欧美成人免费一级人片100| 91免费在线视频| 色婷婷**av毛片一区| 国产精品久久久久久久app| 日韩av电影手机在线观看| 亚洲欧美三级伦理| 国产精品一区久久| 欧美精品video| 狠狠色狠狠色综合日日五| 成人久久一区二区| 97久久超碰福利国产精品…| 精品亚洲夜色av98在线观看| 欧美精品一区在线播放| 国产91热爆ts人妖在线| 日韩免费在线看| 亚洲精品按摩视频| 奇米4444一区二区三区| 欧美理论电影在线播放| 中日韩美女免费视频网址在线观看| 亚洲在线免费视频| 国内精品久久久久影院优| xxx一区二区| 成人激情春色网| 亚洲最新av在线| 国内自拍欧美激情| 日韩精品中文在线观看| 日本久久久久久| 久热爱精品视频线路一| 亚洲视频在线免费观看| 欧美日韩国产精品一区| 国内精品中文字幕| 欧美成人免费va影院高清| 欧美中文字幕第一页| 国产中文字幕亚洲| 国产精品夜色7777狼人| 亚洲女人初尝黑人巨大| 日韩av大片在线| 欧美性猛交xxxx富婆| 精品久久久香蕉免费精品视频| 一道本无吗dⅴd在线播放一区| 久久国产精品网站| 亚洲视频在线观看网站| 成人激情黄色网| 国产三级精品网站| 国产视频亚洲视频| 欧美在线免费观看| 国产日韩欧美中文| 欧美黑人xxxx| 青青精品视频播放| 精品国产户外野外| 国产精品香蕉在线观看| 国产精品激情自拍| 国产精品美女免费视频| 国产精品成人在线| 日韩中文字幕在线视频| 午夜精品三级视频福利| 亚洲女同性videos| 亚洲视频自拍偷拍| 国产日韩欧美在线视频观看| 最好看的2019年中文视频| 日韩视频―中文字幕| 国产日产欧美a一级在线| 红桃视频成人在线观看| 亚洲天堂第二页| 色999日韩欧美国产| 中文字幕精品一区二区精品| 国产精品久久久av久久久| 97在线视频免费| 日韩av影视在线| 午夜精品一区二区三区在线播放| 国产精品欧美激情在线播放| 国产精品扒开腿做爽爽爽男男| 欧日韩不卡在线视频| 欧美日韩在线视频一区|