Lua中的元表(1)

元表

元表就是允許我們改變table的行為,你所改變的這個(gè)行為又關(guān)聯(lián)了一個(gè)方法,這個(gè)方法我們稱(chēng)作元方法(系統(tǒng)提供)。

t = {}

print(getmetatable(t)) ?-- nil ?因?yàn)闆](méi)有設(shè)置其元表

m_t = {

__tostring = function (t) ?--設(shè)置元方法

return "aa"

end

}

t1 = setmetatable(t,m_t)

print(t) -- aa

if(t == t1)

then

print("同一張表") --輸出,所以證明其實(shí)t和t1就是同一張表

end


第二種寫(xiě)法

t = setmetatable({},{

__tostring = function (t)

return 111

end

})

print(t)

在lua中創(chuàng)建新的表或者是其他類(lèi)型的時(shí)候,會(huì)為該類(lèi)型提供元表,但是有一個(gè)特例就是字符串

t = 10

print(getmetatable(t)) -- nil

str = "hello"

print(getmetatable(str))--string自帶元表


常用創(chuàng)建元表的方式

setmetatable的兩個(gè)參數(shù),第一個(gè)參數(shù)為改變行為的那張表,第二個(gè)參數(shù)是元表具體的改變行為


T = setmetatable({},{})


__add(t1,t2)? -- 相加行為

__sub(t1,t2)? -- 相減行為

__mul? ? ? ? -- 相乘行為

__div ? -- 相除行為

__len(t1)? ? -- 表的長(zhǎng)度

__index? ? ? -- 索引查詢(xún)

__newindex? ? -- 更新索引

__tostring ? -- 字符串輸出

......


例子

Window = {}

Window.default = {

x = 0,

y = 0,

width = 100,

height = 100,

color = {

r = 255.0,

g = 255.0,

b = 255.0

}

}

--創(chuàng)建一個(gè)元表

Window.mt = {}

--構(gòu)造函數(shù)

function Window.new(obj)

setmetatable(obj,Window.mt)

return obj

end

--__index元方法:查詢(xún)索引

Window.mt.__index = function (tb,key)

print("該方法被調(diào)用")

return Window.default[key]

end

-- Window.mt.__index = Window.default -- 指定表,如果表中沒(méi)有該字段,則去這個(gè)表中的元表中找,找到__index元方法,這個(gè)方法也可以對(duì)

--應(yīng)一張表,只是這樣的話(huà)不能再做攔截的操作了

local win = Window.new({x = 10,y = 20})

print(win.x) --10

print(win.y) --20

print(win.width) -- 該方法被調(diào)用 100

print(win.height) -- 該方法被調(diào)用 100




print(win.x) 由于win變量本身就擁有了x字段,所以直接打印

print(win.width) 由于win變量沒(méi)有該字段,那么就去查找是否擁有元表,如果有,就去元表中查詢(xún)

先看元表中是否有__index元方法對(duì)應(yīng)的方法或者表,

由于存在__index 所以返回default表中width字段

在實(shí)際開(kāi)發(fā)中__index元方法不一定就對(duì)應(yīng)的是函數(shù),也有可能是表

最后總結(jié)一下 Lua 查找一個(gè)元素時(shí)候的規(guī)則

1.在表中查詢(xún),如果找到返回該元素,找不到繼續(xù)

2.判斷該表是否具備元表,如果有繼續(xù),如果沒(méi)有返回nil

3.判斷元表是否具備某種行為,有繼續(xù),沒(méi)有nil

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,491評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,263評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,946評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,708評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,186評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,409評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,939評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,774評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,976評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,209評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,641評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,872評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,650評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,958評(píng)論 2 373

推薦閱讀更多精彩內(nèi)容

  • 前言 元表對(duì)應(yīng)的英文是metatable,元方法是metamethod。我們都知道,在C++中,兩個(gè)類(lèi)是無(wú)法直接相...
    BobWong閱讀 1,044評(píng)論 0 9
  • 1.1程序塊:Lua執(zhí)行的每段代碼,例如一個(gè)源代碼文件或者交互模式中輸入的一行代碼,都稱(chēng)為一個(gè)程序塊 1.2注釋?zhuān)?..
    c_xiaoqiang閱讀 2,607評(píng)論 0 9
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,717評(píng)論 18 399
  • 越過(guò)山丘,遇見(jiàn)十九歲的我 戴著一雙白手套,喝著我的喜酒 他問(wèn)我幸福與否,是否永別了憂(yōu)愁 為何婚禮上那么多人,沒(méi)有一...
    有點(diǎn)酷的My閱讀 1,037評(píng)論 0 0
  • 漣水閱讀 145評(píng)論 0 1