目錄
1、博客介紹
本篇博客作爲Lua的學習筆記,記錄一下利用元表和元方法來製作一個只讀的表,本篇博客需要對元表相關知識有一定的瞭解,若是對元表不瞭解可以先行跳轉到博主前一篇關於元表的博文,文章底部設有轉送門。
2、內容
首先我們瞭解,Lua中一個空表,我們是可以對其進行幾乎任意的操作,我們可以從中根據對應鍵來獲取相應的值,也可以根據對應的鍵來附加相應的值,如下所示:
local testTable = {}
testTable.width = 10
print(testTable.name) --------nil
我們如何去創建一個只讀的表呢,通過元表,瞭解元表後我們可以知道,我們訪問帶有元表的表時,首先是去訪問該元表的元方法 __index,當我們對帶有元表的表進行賦值的時候,我們會首先訪問該元表的元方法 __newindex,那麼結果顯而易見了,我們可以對錶設置一個代理的空表,該空表設置元表,元表__index返回被代理的表,__newindex則拋出異常,如此便可以實現只讀的表,以下例子:
----------------------------------------首先我們準備一個需要被設置爲只讀的表
local testTable = {}
testTable.width = 10
testTable.print = function()
print("Sun")
end
----------------------------------------該方法將表設置爲只讀
function setOnlyRead(t)
--代理的空表
local proxy = {}
--空表的元表
local meta = {
--被訪問的時候就返回被代理的表
__index = t,
--賦值的時候直接拋出異常
__newindex = function(t,k,v)
error("this table is a read-only table")
end
}
--設置元表
setmetatable(proxy,meta)
--將代理返回
return proxy
end
local readOnlyTable = setOnlyRead(testTable)
print(readOnlyTable.width) ------10
readOnlyTable.print() ------Sun
readOnlyTable.hhh = 100 ------報錯
3、推送
Github:https://github.com/KingSun5
元表:https://blog.csdn.net/Mr_Sun88/article/details/105205942
4、結語
原理很簡單,寫法也很簡單,若是覺得博主的文章寫的不錯,不妨關注一下博主,點贊一下博文,另博主能力有限,若文中有出現什麼錯誤的地方,歡迎各位評論指摘。QQ交流羣:806091680(Chinar)
該羣爲CSDN博主Chinar所創,推薦一下!我也在羣裏!