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

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

 更新時間:2014年09月28日 09:03:59   投稿:junjie  
這篇文章主要介紹了Lua進階教程之閉包函數、元表實例介紹,本文詳細講解了Lua的閉包函數和元表,并同時和C++做了比較,需要的朋友可以參考下

復制代碼 代碼如下:

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構成了一個函數閉包。

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

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

基于對象的實現(xiàn)方式

復制代碼 代碼如下:

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

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

元表

復制代碼 代碼如下:

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規(guī)定了元表可以“重載”對象的加法運算符,因此若把定義了加法運算的元表設置到那兩個表上,它們就可以做加法了。元表是Lua最關鍵的概念之一,內容也很豐富,請參考Lua文檔了解詳情。

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

相關文章

  • Lua編程示例(八):生產者-消費者問題

    Lua編程示例(八):生產者-消費者問題

    這篇文章主要介紹了Lua編程示例(八):生產者-消費者問題,本文直接給出實例代碼,需要的朋友可以參考下
    2015-07-07
  • Lua實現(xiàn)split函數

    Lua實現(xiàn)split函數

    這篇文章主要介紹了Lua實現(xiàn)split函數,lua中沒有split分割字條串函數,本文使用自定義函數實現(xiàn),需要的朋友可以參考下
    2015-04-04
  • Lua中設置table為只讀屬性的方法詳解

    Lua中設置table為只讀屬性的方法詳解

    這篇文章主要給大家介紹了關于Lua中設置table為只讀屬性的方法,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • Lua教程(十七):C API簡介

    Lua教程(十七):C API簡介

    這篇文章主要介紹了Lua教程(十七):C API簡介,本文講解了基礎知識、棧、C API中的錯誤處理、Lua調用C程序、C程序調用Lua代碼的錯誤處理等內容,需要的朋友可以參考下
    2015-04-04
  • Lua教程(十二):面向對象編程

    Lua教程(十二):面向對象編程

    這篇文章主要介紹了Lua教程(十二):面向對象編程,本文講解了類、繼承、私密性等面向對象編程知識,需要的朋友可以參考下
    2015-04-04
  • Lua中的metatable介紹

    Lua中的metatable介紹

    這篇文章主要介紹了Lua中的metatable介紹,Lua 中的每個值都可以用一個 metatable,個 metatable 就是一個原始的 Lua table,它用來定義原始值在特定操作下的行為,要的朋友可以參考下
    2015-04-04
  • Lua中的元表和元方法學習筆記

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

    這篇文章主要介紹了Lua中的元表和元方法學習筆記,本文主要講解了getmetatable獲取元表、setmetatable修改元表等內容,需要的朋友可以參考下
    2014-12-12
  • 簡單的Lua 連接操作mysql數據庫的方法

    簡單的Lua 連接操作mysql數據庫的方法

    lua連接數據庫不只luasql這個庫,但目前更新最快的的貌似是這個luasql,他是開源的,下面我們就來看看如何來具體操作吧
    2015-10-10
  • Lua學習筆記之表和函數

    Lua學習筆記之表和函數

    這篇文章主要介紹了Lua學習筆記之表和函數,本文在代碼中使用大量注釋講解了Lua的表和函數的使用,需要的朋友可以參考下
    2014-09-09
  • Lua流程控制語句if else的使用示例

    Lua流程控制語句if else的使用示例

    今天小編就為大家分享一篇關于Lua流程控制語句if else的使用示例,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12

最新評論

淮阳县| 施秉县| 漳浦县| 简阳市| 皮山县| 大厂| 清徐县| 时尚| 镇沅| 久治县| 漳浦县| 读书| 特克斯县| 南康市| 肇东市| 马山县| 河北区| 汝阳县| 山阳县| 嘉兴市| 巧家县| 棋牌| 宣汉县| 兰州市| 阿拉善右旗| 镇雄县| 阿拉善右旗| 洪江市| 方城县| 青海省| 利川市| 峨眉山市| 留坝县| 珲春市| 雷州市| 长沙县| 确山县| 张家港市| 浑源县| 宜君县| 玉环县|