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

首頁 > 開發 > 綜合 > 正文

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)。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
av在线1区2区| 91超碰免费在线| 最近免费中文字幕大全免费第三页| 香蕉视频在线观看网站| 欧美日韩久久中文字幕| 欧美精品另类| 中文字幕在线播放网址| 国产精品777一区二区| 9999在线视频| 青青草在线视频免费观看| 国产精品一品| 精品卡1卡2卡三卡免费网站| av在线1区2区| 91xxx在线观看| 日本三级在线视频| 国产经典av| 国产美女在线观看| av免费在线免费| 九九精品视频在线观看九九| 国产视频你懂的| 欧美日韩在线视频免费观看| 国产超级va在线视频| 黄网站在线观看高清免费| 69国产精品视频| 天堂中文字幕在线| jizz国产| 精品电影在线| 国产视频福利| www在线免费观看视频| 国产xxxx做受性欧美88| 国产一卡2卡3卡4卡网站免费| www在线免费观看视频| 亚洲欧美精选| av影视在线看| 天堂√中文在线| 在线看黄网址| 在线中文字幕视频| 国产porny蝌蚪视频| 国产精品久久久久白浆| 国产一级性片| 国产视频1区| 国产三区在线观看| 国产免费自拍视频| 九九在线观看免费视频| 欧美成人亚洲高清在线观看| jlzzjlzz欧美| 黄污在线观看| 中文字幕中文字幕在线中高清免费版| 久久久久国产精品嫩草影院| 国产永久免费| 国产偷激情在线| 国产福利视频在线观看| 99热99re6国产在线播放| 国产www在线观看| 91这里只有精品| 97最新国自产拍视频在线完整在线看| 国产探花视频在线观看| 91激情在线| 91九色在线看| 亚洲精品视频区| 开心婷婷激情五月| 国产有码在线| 91黄色在线| 久久99精品久久久久久野外| 国产免费a∨片在线观看不卡| 国产一级在线观看www色| 在线中文字幕视频观看| 波多野结衣久久高清免费| 国产九色视频| 午夜影院在线免费观看| 成人欧美亚洲| 精品视频二区三区| 青青草免费在线观看| 国内外激情在线| 91高清国产| 国产免费黄网站| 91精品专区| 国产女人在线视频| 一本久久精品| 国产麻豆一级片| 亚洲夜夜综合| 精品999视频| 国产欧美一区二区三区小说| 操操操综合网| 伊人免费在线| 国产激情自拍| 国产三区四区在线观看| 麻豆电影传媒二区| 91在线高清| 国产精品欧美韩国日本久久| 国产专区在线播放| 国产中文字幕在线观看| 免费观看久久久久| 免费久久网站| 久久av少妇| 狂野欧美性猛交xxxx乱大交| 本道综合精品| 老司机在线视频二区| 欧美日韩视频精品一区二区| av在线1区2区| 人日人天天爽| 国产综合视频一区二区三区免费| 久草在线视频网| 成年黄网站在线观看免费| 日本啊v在线| 国产有码在线| 中文字幕第一页av| 国产高清视频在线| 国产高清在线观看| 中文字幕av在线| www.亚洲视频| 成人欧美亚洲| 精品亚洲成a人片在线观看| 在线免费看黄网站| 麻豆精品永久免费视频| 中文字幕专区| 精品国产高清a毛片无毒不卡| 亚洲成人国产综合| 九九热视频免费观看| 国产视频1区| heisi视频网在线观看| 免费一区二区三区视频狠狠| 中文字幕在线资源| 国产欧美日韩第一页| 99reav在线| 懂色一区二区三区| 99久久国产视频| 国产麻豆精品视频一区二区| 国产福利视频在线观看| 爱福利在线视频| 国产不卡在线| 久久亚洲资源| 在线视频xx| 二区三区中文字幕| 日本成人a视频| 精品国产免费第一区二区| 国产美女在线一区二区三区| 一本大道久久a久久精品| 午夜视频在线观看网站午夜视频在线 | 国产美女av| av一级在线| 国产深夜视频在线观看| 青青草在线免费观看| 2021天堂中文幕一二区在线观| 丁香花高清视频完整版在线观看| 亚洲欧美日韩综合精品网| 天堂资源在线中文| 麻豆网站在线免费观看| 亚洲夜夜综合| 在线观看的网站你懂的| 精品视频二区| 精品国产免费观看一区| 国产精品久久麻豆| 国产福利片在线| 国产黄色在线观看| 国产性一级片| 尤物视频在线看| 国产一级黄色| 国产日产精品久久久久久婷婷| 国产农村av| 中文字幕成人乱码在线电影| 超碰国产在线观看| 丁香视频五月| 国产丝袜在线| 在线视频xx| а√最新版在线天堂| 激情丁香在线| 国产欧美一区二区三区小说| 国产高清免费在线播放| av免费在线观看网站| 青青草原av在线| 国产精品一区二区三区高清在线| 中文字幕专区| 99热免费观看| 久久国产热视频| 国产一级片麻豆| 精品推荐蜜桃传媒| www免费在线观看| 国产美女高潮| 伊人色综合网| 国产麻豆精品高清在线播放| 国产高清视频在线观看| 亚洲精品男人| 午夜视频在线免费| 亚洲欧美日韩综合精品网| 黄色毛片在线看| 91极品在线| 尤物视频网站在线观看| 伊人网在线免费观看| 欧美性猛交xxxx免费看久久| 1区2区视频| 四虎国产精品永久地址998| 激情视频国产| 一本免费视频| 国产精美视频| 成在线人视频免费视频| 亚洲精品久久久成人| 国产欧美久久久久久久久| av在线1区2区| 2020中文字幕在线播放|