亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Lua進階教程之閉包函數、元表實例介紹

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

 

復制代碼 代碼如下:

function createCountdownTimer(second)
   local ms=second * 1000;
   local function countDown()
      ms = ms - 1;
   return ms;
 end
 return countDown;
end

 

timer1 = createCountdownTimer(1);
for i=1,3 do
   print(timer1());
end
print("------------");
timer2 = createCountdownTimer(1);
for i=0,2 do
   print(timer2());
end


復制代碼 代碼如下:

999
998
997
------------
999
998
997

 

Upvalue:一個函數所使用的定義在它的函數體之外的局部變量(external localvariable)稱為這個函數的upvalue。

在前面的代碼中,函數countDown使用的定義在函數createCountdownTimer中的局部變量ms就是countDown的upvalue,但ms對createCountdownTimer而言只是一個局部變量,不是upvalue。Upvalue是Lua不同于C/C++的特有屬性,需要結合代碼仔細體會。

函數閉包:一個函數和它所使用的所有upvalue構成了一個函數閉包。

閉包是一個內部函數,它可以訪問一個或者多個外部函數的外部局部變量。每次閉包的成功調用后這些外部局部變量都保存他們的值(狀態)。當然如果要創建一個閉包必須要創建其外部局部變量。所以一個典型的閉包的結構包含兩個函數:一個是閉包自己;另一個是工廠(創建閉包的函數)。迭代器需要保留上一次成功調用的狀態和下一次成功調用的狀態,也就是他知道來自于哪里和將要前往哪里。閉包提供的機制可以很容易實現這個任務。

Lua函數閉包與C函數的比較:Lua函數閉包使函數具有保持它自己的狀態的能力,從這個意義上說,可以與帶靜態局部變量的C函數相類比。但二者有顯著的不同:對Lua來說,函數是一種基本數據類型——代表一種(可執行)對象,可以有自己的狀態;但是對帶靜態局部變量的C函數來說,它并不是C的一種數據類型,更不會產生什么對象實例,它只是一個靜態地址的符號名稱。

基于對象的實現方式

 

復制代碼 代碼如下:

function create(name,id)
    local data={name = name,id=id};
    local obj={};
    function obj.GetName()
      return data.name;
 end
 function obj.GetID()
    return data.id;
 end
 function obj.SetName(name)
    data.name=name;
 end
 function obj.SetID(id)
    data.id=id
 end
 return obj;
end

 

o1 = create("Sam", 001)
o2 = create("Bob", 007)
o1.SetID(100)
print("o1's id:", o1.GetID(), "o2's id:",o2.GetID())
o2.SetName("Lucy")
print("o1's name:", o1.GetName(),"o2's name:", o2.GetName())

--o1's id: 100 o2's id: 7
--o1's name: Sam o2's name: Lucy

 

實現方式:把需要隱藏的成員放在一張表里,把該表作為成員函數的upvalue。
局限性:基于對象的實現不涉及繼承及多態。但另一方面,腳本編程是否需要繼承和多態要視情況而定。

元表

 

復制代碼 代碼如下:

t = {}
m = { a = " and ", b = "Li Lei", c = "Han Meimei" }
setmetatable(t, { __index = m}) --表{ __index=m }作為表t的元表
for k, v in pairs(t) do --窮舉表t
    print(v)
end
print("-------------")
print(t.b, t.a, t.c)

 

--輸出結果
---------------
--Li Lei  and  Han Meimei

function add(t1, t2)
    --‘#'運算符取表長度
    assert(#t1 == #t2)
    local length = #t1
    for i = 1, length do
    t1[i] = t1[i] + t2[i]
    end
    return t1
end
--setmetatable返回被設置的表
t1 = setmetatable({ 1, 2, 3}, { __add = add })
t2 = setmetatable({ 10, 20, 30 }, {__add = add })

t1 = t1 + t2
for i = 1, #t1 do
    print(t1[i])
end
--11
--22
--33

 

定義:元表本身只是一個普通的表,通過特定的方法(比如setmetatable)設置到某個對象上,進而影響這個對象的行為;一個對象有哪些行為受到元表影響以及這些行為按照何種方式受到影響是受Lua語言約束的。比如在前面的代碼里,兩個表對象的加法運算,如果沒有元表的干預,就是一種錯誤;但是Lua規定了元表可以“重載”對象的加法運算符,因此若把定義了加法運算的元表設置到那兩個表上,它們就可以做加法了。元表是Lua最關鍵的概念之一,內容也很豐富,請參考Lua文檔了解詳情。

元表與C++虛表的比較:如果把表比作對象,元表就是可以改變對象行為的“元”對象。在某種程度上,元表可以與C++的虛表做一類比。但二者還是迥然不同的:元表可以動態的改變,C++虛表是靜態不變的;元表可以影響表(以及其他類型的對象)的很多方面的行為,虛表主要是為了定位對象的虛方法(最多再帶上一點點RTTI)。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成色999久久网站| 欧美电影在线观看完整版| 91国产美女视频| 成人精品视频久久久久| 欧美巨大黑人极品精男| 欧美黑人视频一区| 青青久久av北条麻妃黑人| 7m第一福利500精品视频| 欧美激情按摩在线| 国产精品女人久久久久久| 欧美日韩加勒比精品一区| 亚洲人在线观看| 在线成人中文字幕| 亚洲精品美女在线观看播放| 欧美小视频在线| 欧美精品在线看| 亚洲精品色婷婷福利天堂| 欧美放荡办公室videos4k| 中文字幕日韩精品在线观看| 欧美不卡视频一区发布| 国内精品一区二区三区| 欧美日韩在线视频一区二区| 川上优av一区二区线观看| 法国裸体一区二区| 91久久精品国产91久久| 亚洲va码欧洲m码| 亚洲免费人成在线视频观看| 一区二区三区四区视频| 日韩精品在线免费| 欧美日韩国产区| 伊人伊成久久人综合网小说| 欧美性猛交99久久久久99按摩| 高清欧美电影在线| 久操成人在线视频| 国产精品永久免费在线| 26uuu亚洲伊人春色| 久久久久久久97| 国产精品久久二区| 欧美日韩一区二区三区| 韩国精品久久久999| 91久久在线视频| 狠狠色狠色综合曰曰| 日韩第一页在线| 国产欧美久久一区二区| 国产一级揄自揄精品视频| 欧美精品电影在线| 欧美最顶级的aⅴ艳星| 亚洲日韩中文字幕| 国产成人精品在线播放| 久久久久久成人精品| 亚洲第一免费网站| 亚洲美女av在线| 国产不卡av在线| 亚洲天堂视频在线观看| 久久99视频免费| 欧美激情视频在线观看| 欧美专区福利在线| 久久这里有精品| 亚洲欧洲日产国产网站| 久久伊人91精品综合网站| 日韩大胆人体377p| 久久久久久久999| 91国自产精品中文字幕亚洲| 中文字幕亚洲一区二区三区| 日韩欧美亚洲成人| 成人夜晚看av| 亚洲欧美国产一本综合首页| 亚洲欧美日韩第一区| 精品日韩美女的视频高清| 成人中文字幕+乱码+中文字幕| 91久久在线播放| 98精品在线视频| 成人免费看黄网站| 91精品久久久久久久久| 992tv成人免费影院| 欧美国产第二页| 色综合久久天天综线观看| 亚洲国产精品99| 亚洲精品国精品久久99热一| 91麻豆国产精品| 在线观看成人黄色| 欧美日韩精品二区| 亚洲男人天堂2024| 亚洲摸下面视频| 久久精品成人一区二区三区| 在线观看中文字幕亚洲| 91影院在线免费观看视频| 日韩一区二区福利| 亚洲精品wwwww| 精品国产乱码久久久久久虫虫漫画| 欧美成人sm免费视频| 久久精视频免费在线久久完整在线看| 粗暴蹂躏中文一区二区三区| 亚洲精品一区二区在线| 日韩视频免费观看| 国产成人拍精品视频午夜网站| 色妞色视频一区二区三区四区| 亚洲人免费视频| 亚洲欧美日韩另类| 国产精品成人v| 正在播放国产一区| 91精品在线播放| 91性高湖久久久久久久久_久久99| 国产精品入口尤物| 中文字幕日韩综合av| 成人av资源在线播放| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产精品大陆在线观看| 亚洲国产精品久久久久久| 欧美国产日韩一区二区| 九九久久国产精品| 亚洲精品第一国产综合精品| 久久精品久久久久| 日韩在线免费高清视频| 亚洲一区亚洲二区| 亚洲国产美女精品久久久久∴| 免费不卡在线观看av| 国产精品无码专区在线观看| 亚洲成人精品在线| 欧美床上激情在线观看| 日韩电影中文字幕在线观看| 亚洲性生活视频在线观看| 狠狠做深爱婷婷久久综合一区| 久久伊人精品视频| 久久亚洲精品毛片| 国产精品永久免费| 欧美天天综合色影久久精品| 国产视频精品xxxx| 国产91在线播放精品91| 亚洲最大福利视频| 91精品国产高清自在线| 福利微拍一区二区| 欧美激情欧美狂野欧美精品| 琪琪第一精品导航| 日韩不卡在线观看| 久久国产精品视频| 国产一区视频在线播放| 91av在线播放视频| 亚洲成人久久网| 日韩av在线资源| 成人精品久久一区二区三区| 国产精品精品视频一区二区三区| 欧美一级在线亚洲天堂| 国产成人精品网站| 日本欧美黄网站| 日韩视频在线免费| 久久亚洲综合国产精品99麻豆精品福利| 亚洲新中文字幕| 九九精品视频在线| 亚洲女同性videos| 国产视频久久久久久久| 日韩视频在线一区| 欧美大片在线免费观看| 久久久精品国产网站| 欧美电影在线观看高清| 综合久久五月天| 国产日韩在线精品av| 2023亚洲男人天堂| 亚洲va欧美va国产综合久久| 欧美在线激情网| 97精品国产97久久久久久免费| 日韩欧美在线视频观看| 疯狂做受xxxx欧美肥白少妇| 97视频免费观看|