国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 開發 > 綜合 > 正文

Lua中的__index和__newindex實例

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

前言

這篇博文將通過幾個簡單的實例演示,鞏固對__index和__newindex的理解,同時加深對Lua中元表和元方法的理解,如果對Lua的元表和元方法還不是很熟悉的話,請參考這篇文章:《Lua中的元表與元方法》。

具有默認值的table

我們都知道,table中的任何字段的默認值都是nil,但是通過元表,我們可以很容易的修改這一規定,代碼如下:

 

復制代碼 代碼如下:

function setDefault(tb, defaultValue)
     local mt = {__index = function () return defaultValue end}
     setmetatable(tb, mt)
end
 
local tb1 = {x = 10, y = 20}
print(tb1.x, tb1.z)     --> 10 nil
setDefault(tb1, 100) -->設置默認值
print(tb1.x, tb1.z) --> 10 100 這里打印的就是默認值

可以看到,在代碼中,setDefault函數為所有需要默認值的table創建了一個新的元表。如果準備創建很多需要默認值得table,這種方法的開銷或許就比較大了。由于在元表中默認值defaultValue是與元方法關聯在一起的,所以setDefault無法為所有table都使用同一個元表。如果要讓具有不同默認值得table都使用同一個元表,那么就需要將每個元表的默認值存放在table本身中,可以使用一個額外的字段來存儲默認值。例如以下代碼:

 

 

復制代碼 代碼如下:

local mt = {__index = function (t) return t.___ end}
function setDefault(tb, defaultValue)
     tb.___ = defaultValue       -- 非常謝謝hellowei犀利的review。具體請參見評論
     setmetatable(tb, mt)
end

上面代碼中的“___”是為了防止名字沖突而起的名字;如果這樣的話,你還擔心名字沖突,確保key在table中的唯一性,只需要創建一個新的table,并用它作為key即可,每一個新創建的table都是一個唯一的地址,比如以下代碼:

 

 

復制代碼 代碼如下:

local key = {} -- 唯一的key
local mt = {__index = function (tb) return tb[key] end}
 
function setDefault(tb, defaultValue)
     tb[key] = defaultValue
     setmetatable(tb, mt)
end

 

記錄table的訪問

有的時候,一種特定的需求,我們需要記錄對一個table的所有訪問,不管是查詢還是更新,我們都需要記錄日志。這如何完成?我們都知道,元表中的__index和__newindex是在table中沒有所需要訪問的index時才發揮作用的,因此,只有將一個table保持為空,然后設置__index和__newindex元方法,才有可能記錄下來所有對它的訪問。

為了監視一個table的所有訪問,就應該為真正的table創建一個代理。這個代理就是一個空的table,其中__index和__newindex元方法可用于跟蹤所有的訪問,并將訪問重定義到原來的table上。這就是思路,接下來看代碼:

 

復制代碼 代碼如下:

local t = {} --原來的table
 
-- 保持對原table的一個引用
local _t = t
 
-- 創建代理
t = {}
 
-- 創建元表
local mt = {
__index = function (t, k)
print("access to element " .. tostring(k))
return _t[k]
end,
 
__newindex = function (t, k, v)
print("update of element " .. tostring(k))
_t[k] = v
end
}
 
setmetatable(t, mt)
 
t.x = 10 -- update of element x
print(t.x) -- access to element x

如果想要同時監視幾個table,無須為每個table創建不同的元表;相反,只要以某種形式將每個代理與其原table關聯起來,并且所有代理都共享一個公共的元表。這個問題與設置table默認值相關聯的問題類似,也是將原來的table保存在代理table的一個特殊的字段中。代碼如下:

 

 

復制代碼 代碼如下:

-- 創建唯一索引
local index = {}
 
-- 創建元表
local mt = {
     __index = function (t, k)
          print("access to element " .. tostring(k))
          return t[index][k]
     end,
 
     __newindex = function (t, k, v)
          print("update of element " .. tostring(k))
          t[index][k] = v
     end
}
 
function track(t)
     local proxy = {}
     proxy[index] = t
     setmetatable(proxy, mt)
     return proxy
end
 
local t = {}
local proxy = track(t)
proxy.x = 10
print(proxy.x)

 

只讀的table

通過代理的概念,可以很容易的實現只讀的table。只需要跟蹤所有對table的更新操作,并引發一個錯誤就好了,對于查詢時,我們不用去館,只需要管對table的更新操作,廢話不說,來段簡單的代碼,自然而然的一目了然了。

復制代碼 代碼如下:

function readOnly(t)
     local proxy = {}
 
     -- 創建元表
     local mt = {
          __index = t,
          __newindex = function (t, k, v)
               error("Attempt to update a read-only table", 2)
          end
     }
 
     setmetatable(proxy, mt)
     return proxy
end
 
local tbDemo = readOnly{1, 2, 3, 4, 5}
print(tbDemo[1])
tbDemo[1] = 20

元表中__index對應的是原來的table,而更新原來的table時,就會顯示錯誤提示:Attempt to update a read-only table。

 

總結

這篇文章對Lua中的__index和__newindex的使用進行了詳細的講解和分析,并提供了實際的代碼,主要是為了加深對Lua中元表和元方法的理解,元表和元方法在Lua中的地位太總要了,很多高級的編程技巧和特殊需求都是基于元表和元方法來實現了,所以,也希望大家能好好的閱讀這篇文章,同時也希望我的文章對大家有幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
91caoporn在线| 国产麻豆一级片| 狠狠狠狠狠狠操| 中文字幕色视频| 最近中文字幕大全中文字幕免费| av资源网站在线观看| 中文字幕久热在线精品| 四虎精品成人a在线观看| 青青草视频免费在线观看| www.麻豆av.com| 亚洲第一成年免费网站| 在线免费国产视频| 国产二区视频| 国产a级网站| 国产高清大尺度一区二区不卡| 中文字幕专区| 伊人影院在线视频| 久久精品国产麻豆| 激情四房婷婷| 国产精品入口麻豆免费看| 中文在线观看视频| 亚洲日本久久久午夜精品| 九九色在线观看| 99在线免费视频| 中文字幕人成高视频| 午夜在线不卡| 国产黄色在线免费观看| 国产原创精品视频| av在线免费播放网站| 国产无遮挡又黄又爽免费网站 | 美女国产在线| 精品卡1卡2卡三卡免费网站| 午夜小视频在线| 国产不卡在线| 999福利在线视频| 国产欧美黑人| 国产激情视频一区二区三区| 国产一区电影| 丁香视频五月| 91福利在线免费| 国产乱人视频免费播放| 欧美大交乱xxxx| 九九热在线视频| 九九热精品在线视频| 天天操天天操天天色天天要| 国产午夜在线| 国产免费福利网站| 在线免费观看黄色av| 精品免费视频一卡2卡三卡4卡不卡| 天天插天天干| 国产网站免费观看| 国产精品美女一区二区三区四区| 成在在线免费视频| 天天av天天爱| 国产爆初菊在线观看免费视频网站 | 国产偷窥老熟盗摄视频| 国产高清免费在线播放| 国产黄色在线看| 在线成人一区| 操操操综合网| 国产色在线观看| 91九色在线看| 非洲黑人最猛性xxxx交| 国产日韩欧美第一页| 久久这里精品| 国产精品被窝福利一区| 伊人网在线免费观看| 九九99精品| 91社区在线观看| 国产中文字幕网| 96精品视频| 不卡av免费观看| 国产一区精品| 欧美一级久久久久久久久大| 国产毛片视频| 日韩精品免费一区二区| 国产精品99999| 免费看av大片| 国产95在线|亚洲| 男人操女人免费网站| 国产高清一级片| 尤物网站在线| 免费看av大片| 美女被人操视频在线观看| 在线国产网址| 97国产在线| 懂色一区二区三区| 亚洲欧美日韩综合精品网| 中文字幕在线免费| 青青久在线视频免费观看| 99色在线观看| 国产精品入口麻豆免费看| 国内外激情在线| 久久精品亚洲7777影院| www.蜜桃av| а√最新版在线天堂| jizz性欧美| 久热精品视频在线播放| 免费a级毛片在线观看| 色悠久久久久综合网小说| 亚洲欧美日韩综合精品网| 国产精品合集一区二区| 国产污视频在线| 国产精品黄页网站在线播放免费| 国产午夜三区视频在线| 狠狠综合久久久综合| 国产你懂的在线观看| 成人免费一区二区三区视频网站| 成在在线免费视频| 国产一区二区影视| 国产人成在线观看| 精品国产白色丝袜高跟鞋| 精精国产xxxx视频在线动漫 | 国精一区二区三区| 丁香视频免费观看| 国产一级片麻豆| 在线天堂av| 狠狠操视频网| 国产娇喘精品一区二区三区图片| 国产叼嘿网站免费观看不用充会员| 国产人成高清视频观看| 香蕉视频在线看| 天天av综合网| 一本大道香蕉久久| 欧美午夜电影一区二区三区| 国产精品一区二区婷婷| 97国产视频| 国产69久久| 伊人春色在线| 麻豆精品传媒视频观看| 国产精品剧情一区二区在线观看| 在线视频色在线| 国产免费视频| baoyu777.永久免费视频| 国产理论片免费观看| 伊人222成人综合网| 国产乱xxⅹxx国语对白| av网站在线播放| 国产亚洲精品自在线观看| 亚洲综合激情六月婷婷在线观看 | 日韩av成人| av在线日韩国产精品| 国产天堂av| 黄色毛片在线| 99在线视频影院| 国产视频xxxx| 成人精品福利| 毛片网站在线观看| 一本大道五月香蕉| 国产成人亚洲综合小说区| 五月婷婷开心综合| 豆国产97在线|亚洲| 波多野结衣久久高清免费| av激情在线| 在线观看午夜av| 国产香蕉免费精品视频| 国产精品一二三区视频| www.操操操.com| www.九九热.com| 亚洲成人av高清| 三级小说一区| 日本18视频网站| 麻豆国产视频| 久热中文字幕| 国产美女在线播放| 国产麻豆综合视频在线观看| 五月天亚洲激情| 国产欧美黑人| 91啦中文在线| 日本a级黄色| 欧美高清视频| 中文字幕专区| 69精品视频| 日本卡一卡2卡3卡4精品卡网站| a视频在线播放| 成人午夜无人区一区二区| 国产三区四区在线观看| 精品福利视频导航大全| 在线观看wwww| 国产免费高清| 在线观看wwww| 国产精品一区在线看| 91美女在线| 丁香婷婷激情| 夜夜操天天干| 国产在线免费观看| 中文av资源在线| 五月天丁香在线| a视频在线观看免费| 国产精品jvid在线观看| 免费精品国产自产拍在| 国产精品jvid在线观看| www.夜夜操| 国产激情在线| 国产美女一区视频| 日本成人网址| 伊人222成人综合网| 国产丝袜在线播放| 欧洲亚洲精品视频| 伊人狠狠av|