Lua-元表

簡介

模塊庫類似一個(gè)封裝庫锅锨,存放公用代碼,以api接口形式被其他調(diào)用

-- module.lua模塊
-- 定義模塊
module={}

-- 定義常量
module.a=1
-- 定義公有函數(shù)
function module.fun1()
    print("public");
end
-- 定義私有函數(shù)
local function module.fun2()
    print("private");
end
-- return
return module


-- test.lua調(diào)用
require("module")
module.fun1()

元表

元表(metatable)提供兩個(gè)table之間的操作

  • set:將table設(shè)置為元表 (若元表存在_metatable鍵值 則設(shè)置失斔洳选)

    mytable={}        --普通表
    metatable={}  --元表
    setmetatable(mytable,metatable)   --設(shè)置為元表
    
  • get:獲取對(duì)象的元表

    getmetatable(mytable)
    

元方法

  • __index:訪問表橡类,表中沒有對(duì)應(yīng)值時(shí),去元表的__index中找(__table可以是表包含很多)

    t1={a=1,b=2};
    t2={};
    setmetatable(t1,t2);
    print(t1.c);
    
    -- 包含表
    t3={a=1,b=2};
    t4={__index={c=3}};
    setmetatable(t3,t4);
    print(t3.c);
    
    -- 包含函數(shù)(function注意包含t6參數(shù))
    t5={a=1,b=2};
    t6={__index=
      function(t6,key)
          if(key=="c") then
              return 3;
          else
              return nil;
          end
      end
    };
    setmetatable(t5,t6);
    print(t5.c);
    
    -- 或者寫法
    t7={a=1,b=2};
    setmetatable(t7,{__index={c=3}});
    print(t7.c);
    
  • __newindex:更新表芽唇,賦值對(duì)應(yīng)鍵值顾画,若沒有,就會(huì)去元表的__newindex中找

    m={d=4};
    meta={__newindex=m};
    mytable={a=1,b=2};
    setmetatable(mytable,meta);
    mytable.c=3;  -- 將c鍵值加到m中
    print(mytable.c,m.c,mytable.d,m.d);   -- nil 3 nil 4
    
    m={d=4};
    meta={__newindex=m,__index=m};
    mytable={a=1,b=2};
    setmetatable(mytable,meta);
    mytable.c=3;  -- 將c鍵值加到m中 此刻m含有c鍵值
    print(mytable.c,m.c,mytable.d,m.d);   -- 3 3 4 4
    
    -- 或者寫法
    m={d=4};
    mytable={a=1,b=2};
    setmetatable(mytable,{__newindex=m,__index=m});
    
    mytable.c=3;
    print(mytable.c,m.c,mytable.d,m.d);
    
  • rawget rawset:rawget可以直接獲取索引實(shí)際值匆笤,不通過__index元方法 rawset可以直接對(duì)表中索引賦值研侣,不通過__newindex元方法

    -- rawget調(diào)用方式不同
    t7={a=1,b=2};
    setmetatable(t7,{__index={c=3}});
    --print((t7.c));
    print(rawget(t7,c));
    
    -- rawset賦值方式不同
    m={};
    mytable={a=1,b=2};
    setmetatable(mytable,{__newindex=m});
    --mytable.c=3;
    rawset(mytable,"c",3);
    print(mytable.c,m.c);
    
  • 操作符:就是對(duì)應(yīng)符號(hào)對(duì)應(yīng)的”__名字“,主要還是對(duì)應(yīng)操作符后面寫的方法

    mytable={a=1,b=2,c=3};
    meta={__add=
      function(first,second)
          for k,v in pairs(second) do
              table.insert(first,v);
          end
          return first;                   -- 元表就是一個(gè)操作
      end
    }
    mytable = setmetatable(mytable,meta)
    
    secondtable={d=4,e=5,f=6};
    mytable=mytable+secondtable;
    
    for k,v in pairs(mytable) do
      print(v);
    end
    
    --[[ 對(duì)應(yīng)其他的操作
    +     =>  __add
    -(減號(hào))  =>  __sub  
    *     =>  __mul
    /     =>  __div
    %     =>  __mod
    -(負(fù)號(hào))  =>  __unm
    ..        =>  __concat
    ==        =>  __eq
    <     =>  __lt
    <=        =>  __le
    ]]
    
  • __call:在Lua調(diào)用一個(gè)值時(shí)調(diào)用炮捧,就是調(diào)用每個(gè)值可能要進(jìn)行統(tǒng)一操作

    mytable={"111","222"};
    meta={__call=
      function(first,a)
          return("id="..a.." is "..first[a]);
      end
    }
    mytable=setmetatable(mytable,meta)
    
    print(mytable(2));
    
  • __tostring:修改表的輸出行為

    mytable={"111","222"};
    meta={__tostring=
      function(first)
          for k,v in ipairs(first) do
              return("id="..k.." is "..v);
          end
      end
    }
    setmetatable(mytable,meta)
    
    print(mytable);
    

總結(jié)

  • meta元表代表的是一種操作庶诡,放在其他地方也這樣寫,與具體的表無關(guān)
  • meta元表可以做很多操作咆课,命名不同末誓,具體做什么在function里面實(shí)現(xiàn)
  • meta元表可以做很多初始化或者類似構(gòu)造函數(shù)的功能,面向?qū)ο缶幊?/li>
  • pairs:是迭代器的元方法书蚪,__pairs

參考

http://www.reibang.com/nb/4814025

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末喇澡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子殊校,更是在濱河造成了極大的恐慌晴玖,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件为流,死亡現(xiàn)場離奇詭異呕屎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)敬察,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門秀睛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人静汤,你說我怎么就攤上這事琅催【有祝” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵藤抡,是天一觀的道長侠碧。 經(jīng)常有香客問我,道長缠黍,這世上最難降的妖魔是什么弄兜? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮瓷式,結(jié)果婚禮上替饿,老公的妹妹穿的比我還像新娘。我一直安慰自己贸典,他們只是感情好视卢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著廊驼,像睡著了一般据过。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妒挎,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天绳锅,我揣著相機(jī)與錄音,去河邊找鬼酝掩。 笑死鳞芙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的期虾。 我是一名探鬼主播原朝,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼镶苞!你這毒婦竟也來了竿拆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤宾尚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后谢澈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煌贴,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年锥忿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了牛郑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡敬鬓,死狀恐怖淹朋,靈堂內(nèi)的尸體忽然破棺而出笙各,到底是詐尸還是另有隱情,我是刑警寧澤础芍,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布杈抢,位于F島的核電站,受9級(jí)特大地震影響仑性,放射性物質(zhì)發(fā)生泄漏惶楼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一诊杆、第九天 我趴在偏房一處隱蔽的房頂上張望歼捐。 院中可真熱鬧,春花似錦晨汹、人聲如沸豹储。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剥扣。三九已至,卻和暖如春慨灭,著一層夾襖步出監(jiān)牢的瞬間朦乏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國打工氧骤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呻疹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓筹陵,卻偏偏與公主長得像刽锤,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子朦佩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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

  • Lua元表 在Lua中,我們可以通過key找到對(duì)應(yīng)的value值并思,但是無法對(duì)兩個(gè)table進(jìn)行操作。 在Lua中為...
    滄州寧少閱讀 417評(píng)論 0 1
  • 元表這個(gè)詞聽起來就覺得抽象语稠,我開始接觸Lua的時(shí)候就是這種感覺宋彼。其實(shí)不要被表面嚇到。 元表就是仙畦,如果一個(gè)table...
    程序員喜歡自嘲閱讀 11,928評(píng)論 0 6
  • Lua 元表(Metatable) 作者:楊夢(mèng)鴿 校對(duì):翟舒青 在 Lua table 中我們可以訪問對(duì)應(yīng)的key...
    木易林1閱讀 516評(píng)論 0 2
  • 在 Lua table 中我們可以訪問對(duì)應(yīng)的key來得到value值输涕,但是卻無法對(duì)兩個(gè) table 進(jìn)行操作。 因...
    誰說我是小小云閱讀 769評(píng)論 0 0
  • 前言 元表對(duì)應(yīng)的英文是metatable慨畸,元方法是metamethod莱坎。我們都知道,在C++中寸士,兩個(gè)類是無法直接相...
    BobWong閱讀 1,040評(píng)論 0 9