最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Lua中的元表和元方法學習筆記

 更新時間:2014年12月10日 11:54:23   投稿:junjie  
這篇文章主要介紹了Lua中的元表和元方法學習筆記,本文主要講解了getmetatable獲取元表、setmetatable修改元表等內容,需要的朋友可以參考下

元表(metatable)是 Lua 里每種類型的值的默認操作方式的集合,例如,數字可以加減乘除、字符串可以連接合并、table 可以插入一對 key-value 值、函數可以被調用等等,這些操作都遵循其預定義的行為來執(zhí)行。

而值的默認操作方式不是一成不變的,可以通過元表來修改其行為表現,或者是新定義一些默認沒有的操作。例如,當兩個 table 相加時, Lua 會檢查它們之間的元表里是否有 "__add" 這個函數,如果定義有這個函數, 則調用這個函數來執(zhí)行一次加法操作。

這里,相加這個操作的函數名 -- "__add" 是元表的鍵名(元表的鍵名也稱之為事件(event),一般以 2 個下劃線 "_" 開頭),而 "__add" 函數則是這個相加操作的元方法(metamethod)。對于值的操作,Lua 都將其關聯上一個被稱作事件的指定健,當 Lua 需要對一個值發(fā)起這些操作中的一個時, 它會去檢查值的元表里是否有對應事件。如果有,則鍵名對應的值(元方法)將控制 Lua 怎樣去執(zhí)行這個操作。

getmetatable - 獲取元表

Lua 里每個值都有一個元表。table 類型和 userdata 類型的值可以有各自獨立的元表,而其他類型的值則是公用其類型所預先定義的元表。例如,可以用 getmetatable 來獲取一個字符串的元表:

復制代碼 代碼如下:

a = "just a test"
print(getmetatable(a))

上面的操作會輸出 "table: 0x7fa8614080f0" 的 table,里面包含著預先定義給字符串的操作方法,其內容結構如下:

復制代碼 代碼如下:

-__index-sub [function: 0x7fee39408050]
        -upper [function: 0x7fee394080a0]
        -len [function: 0x7fee39407ec0]
        -gfind [function: 0x7fee39407e20]
        -rep [function: 0x7fee39407fb0]
        -find [function: 0x7fee39407d30]
        -match [function: 0x7fee39407f60]
        -char [function: 0x7fee39407c90]
        -dump [function: 0x7fee39407ce0]
        -gmatch [function: 0x7fee39407e20]
        -reverse [function: 0x7fee39408000]
        -byte [function: 0x7fee39407c40]
        -format [function: 0x7fee39407d80]
        -gsub [function: 0x7fee39407e70]
        -lower [function: 0x7fee39407f10]

Lua 在創(chuàng)建新的 table 時不會創(chuàng)建元表,因此想調用 getmetatable 函數獲取其元表的話,只會返回一個 nil 值。

復制代碼 代碼如下:

tbl = {}
print(getmetatable(tbl))

setmetatable - 修改元表

對于上面所說的新創(chuàng)建的 table 是空元表的問題,可以用 setmetatable 來修改其元表:

復制代碼 代碼如下:

tbl = {}
t1 = {key = "val"}
setmetatable(tbl, t1)
print(getmetatable(tbl))

對于上面所說的 2 個 table 相加的情況,可以給 table 添加一個 __add 的元方法就可以進行相加操作:

復制代碼 代碼如下:

t1 = {"a", "b", "c", "d"}
t2 = {5, 6, 7, 8, 9}
 
mt = {}
mt.__add = function(a, b)
    local tbl = {}
    local ret = {}
    for k, v in pairs(a) do tbl[v] = true end
    for k, v in pairs(b) do tbl[v] = true end
    for k, v in pairs(tbl) do
        table.insert(ret, k)
    end
    return ret
end
 
setmetatable(t1, mt)
setmetatable(t2, mt)
 
t = t1 + t2
for k, v in pairs(t) do print(v) end

相關文章

  • Lua中基本的數據類型、表達式與流程控制語句講解

    Lua中基本的數據類型、表達式與流程控制語句講解

    這篇文章主要介紹了Lua中基本的數據類型、表達式與流程控制語句講解,總結了Lua入門學習中的基礎語法知識,需要的朋友可以參考下
    2016-06-06
  • Lua學習筆記之數據類型

    Lua學習筆記之數據類型

    這篇文章主要介紹了Lua學習筆記之數據類型,本文同時講解了開發(fā)環(huán)境的搭建,需要的朋友可以參考下
    2014-09-09
  • Lua cjson模塊編譯筆記及錯誤解決方法

    Lua cjson模塊編譯筆記及錯誤解決方法

    這篇文章主要介紹了Lua cjson模塊編譯筆記及錯誤解決方法,本文著重講解報錯的解決方法,修改了Makefile文件解決了錯誤問題,需要的朋友可以參考下
    2015-06-06
  • Lua中的文件I/O操作教程

    Lua中的文件I/O操作教程

    這篇文章主要介紹了Lua中的文件I/O操作教程,是Lua入門學習中的基礎知識,需要的朋友可以參考下
    2015-05-05
  • Lua中的迭代器和泛型for學習總結

    Lua中的迭代器和泛型for學習總結

    這篇文章主要介紹了Lua中的迭代器和泛型for學習總結,本文講解了迭代器和泛型for的基礎知識、泛型for的語義、無狀態(tài)的迭代器等內容,需要的朋友可以參考下
    2014-09-09
  • Lua中實現php的strpos()以及strrpos()函數

    Lua中實現php的strpos()以及strrpos()函數

    這篇文章主要介紹了在Lua中實現php的strpos()以及strrpos()函數的方法,需要的朋友可以參考下
    2014-11-11
  • Lua調用自定義C模塊

    Lua調用自定義C模塊

    Lua可以調用C函數的能力將極大的提高Lua的可擴展性和可用性。對于有些和操作系統(tǒng)相關的功能,或者是對效率要求較高的模塊,我們完全可以通過C函數來實現,之后再通過Lua調用指定的C函數。對于那些可被Lua調用的C函數而言,其接口必須遵循Lua要求的形式
    2015-09-09
  • Nginx+lua 實現調用.so文件

    Nginx+lua 實現調用.so文件

    本文給大家分享的是Nginx結合lua 實現調用.so動態(tài)鏈接庫文件的方法和示例,有需要的小伙伴可以參考下
    2017-05-05
  • Lua編程示例(二):面向對象、metatable對表進行擴展

    Lua編程示例(二):面向對象、metatable對表進行擴展

    這篇文章主要介紹了Lua編程示例(二):面向對象、metatable對表進行擴展,本文直接給出實例代碼,需要的朋友可以參考下
    2015-07-07
  • Lua教程(六):綁定一個簡單的C++類

    Lua教程(六):綁定一個簡單的C++類

    這篇文章主要介紹了Lua教程(六):綁定一個簡單的C++類,本文是最后一篇C/C++與Lua交互的教程,其他教程請參閱本文下方的相關文章,需要的朋友可以參考下
    2014-09-09

最新評論

玉林市| 大同县| 延津县| 台南县| 咸宁市| 新河县| 手机| 临城县| 顺昌县| 中牟县| 吉安市| 镇康县| 峨山| 达日县| 清苑县| 楚雄市| 保靖县| 廉江市| 聊城市| 莆田市| 大丰市| 锡林郭勒盟| 延安市| 亳州市| 灯塔市| 正安县| 新乡县| 孟连| 蒙阴县| 教育| 淮阳县| 广灵县| 仁怀市| 西盟| 玉环县| 娱乐| 南雄市| 泸西县| 临海市| 凤凰县| 岑巩县|