亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > Lua中設置table為只讀屬性的方法詳解

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

熱門標簽:昆明電話外呼系統好么 海口智能語音電銷機器人好用嗎 衡水外呼線路解決 電話機器人每天搜索多少次 杞縣地圖標注app 外呼系統一天耗費多少流量 陜西便宜電銷機器人軟件 免費門店地圖標注注冊入駐 艾比利外呼系統

項目中部分只讀表易被人誤改寫,故決定在非線上環境里對這些表附加只讀屬性,方便在出現誤改寫的時候拋出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=t1

local t3 = read_only(t1)

print(t3.d, t3.c.e, t3.c.c.b.t2.fdsf)
function q1() t3.d = 4555 end
function q2() t3.c.d = 90 end
function q3() t3.c.c.b.t2.fdsf =90 end
function q4() table.remove(t3.a) end
function q5() t3.b[ddss] = nil end
function q6() t3[f] = 89 end
function q7() table.insert(t3.a, 999) end

print(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)
end
for k,v in pairs(t3.a) do
 print("===pairs t3.a:",k,v)
end
for k,v in ipairs(t3) do
 print("===ipairs t3:",k,v)
end
for k,v in ipairs(t3.a) do
 print("===ipair t3.a",k,v)
end
print("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: 0x20d4ba0
false input:17: error write to a read-only table with key = d
false input:17: error write to a read-only table with key = d
false input:17: error write to a read-only table with key = fdsf
false input:17: error write to a read-only table with key = 2
false input:17: error write to a read-only table with key = nil
false input:17: error write to a read-only table with key = nil
false 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 89
len t3: 0
len t3.a: 2
table: 0x20d4870 table: 0x20d4870
table: 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,可以直接訪問獲得

總結

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

您可能感興趣的文章:
  • 深入談談lua中神奇的table
  • Lua Table轉C# Dictionary的方法示例
  • Lua編程示例(一):select、debug、可變參數、table操作、error
  • 舉例講解Lua中的Table數據結構
  • Lua table中安全移除元素的方法
  • Lua的table庫函數insert、remove、concat、sort詳細介紹
  • C++遍歷Lua table的方法實例
  • Lua中釋放table占用內存的方法
  • Lua中table的遍歷詳解
  • Lua中獲取table長度問題探討
  • Lua中獲取table長度的方法
  • Lua中table里內嵌table的例子
  • Lua面向對象編程之基礎結構table簡例

標簽:西寧 南京 海口 泰安 宿遷 營口 臨滄 昌都

巨人網絡通訊聲明:本文標題《Lua中設置table為只讀屬性的方法詳解》,本文關鍵詞  Lua,中,設置,table,為,只讀,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Lua中設置table為只讀屬性的方法詳解》相關的同類信息!
  • 本頁收集關于Lua中設置table為只讀屬性的方法詳解的相關信息資訊供網民參考!
  • 推薦文章
    日日日夜夜操| 97视频免费在线| 久久久久久久网| 欧美激情一区二区三区视频| 青青青草影院 | 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产一区二区精品久久| 国产美女在线观看| 欧美另类videosbestsex久久| 九九免费高清在线观看视频| 久久精品免视看国产明星| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 在线观看成人网 | 国产美女在线观看| 精品国产一区二区三区国产馆| 欧美国产日韩精品| 成人免费观看视频| 色综合久久天天综合绕观看| 欧美日本免费| 国产一区免费在线观看| 麻豆网站在线免费观看| 香蕉视频久久| 成人免费观看视频| 久久精品店| 国产国产人免费视频成69堂| 亚州视频一区二区| 可以免费看污视频的网站| 日韩中文字幕在线观看视频| 精品国产一区二区三区久久久蜜臀| 亚洲精品影院久久久久久| 久久国产一久久高清| 日本在线www| 国产成人精品综合| 一级片片| 你懂的在线观看视频| 日韩免费片| 999久久66久6只有精品| 久久99这里只有精品国产| 日韩中文字幕一区二区不卡| 天天色色网| 欧美国产日韩一区二区三区| 麻豆系列国产剧在线观看| 黄色福利片| 韩国毛片免费| 欧美激情一区二区三区中文字幕| 久久国产精品自由自在| 亚洲第一页乱| 久久99爰这里有精品国产| 久草免费在线视频| 日韩欧美一二三区| 成人免费福利片在线观看| 精品视频在线看 | 国产一区二区精品久久91| 91麻豆精品国产高清在线| 日韩字幕在线| 九九久久国产精品大片| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产成人精品在线| 久久精品成人一区二区三区| 国产a网| 国产不卡在线播放| 欧美一级视频免费观看| 日韩免费在线观看视频| 午夜在线观看视频免费 成人| 亚洲第一页乱| 欧美日本韩国| 亚欧乱色一区二区三区| 国产一区二区精品| 四虎影视精品永久免费网站| 日韩在线观看视频黄| 免费一级生活片| 韩国三级视频在线观看| 久久99中文字幕久久| 国产精品免费久久| 国产一区免费在线观看| 日本在线不卡视频| 国产精品12| 欧美日本国产| 欧美一区二区三区在线观看| 99热精品在线| 欧美电影免费看大全| 精品国产香蕉在线播出| 亚欧视频在线| 欧美激情一区二区三区中文字幕| 韩国毛片 免费| 97视频免费在线| 青青久久精品国产免费看| 免费毛片播放| 青青久久精品| 国产一级强片在线观看| 91麻豆精品国产综合久久久| 日韩男人天堂| 九九九国产| 欧美1区| 成人免费高清视频| 日本在线不卡免费视频一区| 91麻豆爱豆果冻天美星空| 国产91素人搭讪系列天堂| 久久福利影视| 日韩专区亚洲综合久久| 日日爽天天| 国产一区二区福利久久| 九九精品久久| 青青久久精品国产免费看| 在线观看成人网 | 国产网站在线| 高清一级片| 高清一级做a爱过程不卡视频| 精品国产三级a| 日日夜夜婷婷| 欧美国产日韩一区二区三区| 99久久网站| 欧美a级v片不卡在线观看| 国产成人精品综合| 日韩一级黄色大片| 日本伦理片网站| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 亚洲第一页乱| 你懂的日韩| 精品在线视频播放| 日日爽天天| 九九免费高清在线观看视频| 日韩avdvd| 免费一级片网站| 九九精品影院| 国产精品1024永久免费视频 | 久草免费在线观看| 午夜激情视频在线播放| 国产精品免费久久| 成人a大片在线观看| 九九热国产视频| 久久国产精品只做精品| 亚洲天堂一区二区三区四区| 黄视频网站在线观看| 91麻豆精品国产综合久久久| 久久国产精品永久免费网站| 国产麻豆精品免费密入口| 国产成人女人在线视频观看| 国产福利免费视频| 亚洲爆爽| 日韩av东京社区男人的天堂| 国产网站免费在线观看| 免费一级片网站| a级精品九九九大片免费看| 亚洲 男人 天堂| 999久久66久6只有精品| 国产伦精品一区三区视频| a级黄色毛片免费播放视频| 你懂的在线观看视频| 欧美a级v片不卡在线观看| 欧美1卡一卡二卡三新区| 欧美爱色| 日本免费看视频| 国产一级强片在线观看| 国产91精品系列在线观看| 久久久久久久男人的天堂| 免费国产在线观看不卡| 日韩av成人| 尤物视频网站在线| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产精品自拍在线观看| 欧美1区| 国产成a人片在线观看视频| 99热热久久| 91麻豆精品国产自产在线观看一区 | 可以在线看黄的网站| 欧美国产日韩一区二区三区| 国产一区二区精品| 国产美女在线观看| 国产一级强片在线观看| 亚洲天堂一区二区三区四区| 国产韩国精品一区二区三区| 国产成人精品在线| 亚洲 男人 天堂| 国产视频一区二区三区四区| 日韩中文字幕在线亚洲一区| 精品视频在线观看免费| 二级特黄绝大片免费视频大片| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日韩专区在线播放| 欧美另类videosbestsex久久| 欧美激情一区二区三区在线| 黄视频网站免费看| 成人高清护士在线播放| 国产美女在线观看| 天天做日日爱夜夜爽| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 一级女性全黄生活片免费| 亚洲 国产精品 日韩| 可以在线看黄的网站| 成人免费观看的视频黄页| 精品国产亚一区二区三区| 尤物视频网站在线| 色综合久久天天综线观看| 日韩免费在线视频| 国产一区国产二区国产三区| 国产精品123| 国产成人啪精品| 日韩一级黄色大片| 国产不卡在线观看视频|