亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

LUA中的閉包(closure)淺析

 更新時(shí)間:2015年02月07日 20:47:13   投稿:junjie  
這篇文章主要介紹了LUA中的閉包(closure)淺析,本文給出實(shí)例講解LUA中的閉包,需要的朋友可以參考下

之前對(duì)closure一知半解,在網(wǎng)上也找不到一篇文章能把它說(shuō)清楚,今天好像第一次對(duì)它有點(diǎn)清晰的了解 了,寫(xiě)個(gè)BLOG記念一下

lua的函數(shù)是一種 First-Class Value 的東西, 到底是啥?
就是它們與傳統(tǒng)類(lèi)型的變值沒(méi)啥區(qū)別,
可以 存到一個(gè)變量中,
可以 存到table中,
可以 作為實(shí)參傳遞給其它函數(shù),
可以 作為其它函數(shù)的返回值.

它們還具有特定的詞法域(Lexical Scoping), 也就是說(shuō), 一個(gè)函數(shù)可以嵌套在另一個(gè)函數(shù)中, 內(nèi)部的函數(shù)可以訪(fǎng)問(wèn)外部函數(shù)中的變量.
如下面的例子:

復(fù)制代碼 代碼如下:

function test(x)
    return function (value)
        return value * x
    end
end

func = test(10)

print( func(11) )


在test()中,嵌套了一個(gè)匿名函數(shù)作為返回值, 而在這個(gè)匿名函數(shù)中 可以訪(fǎng)問(wèn)外部的 value 變量
再看另一個(gè)例子
復(fù)制代碼 代碼如下:

function newCounter()
        local i = 0
        func = function()
                i = i + 1
                return i
        end

        return func
end

c = newCounter()
print(c())
print(c())

c1 = newCounter()
print(c1())
print(c1())


代碼中, 函數(shù) func 里訪(fǎng)問(wèn)了一個(gè) "非局部的變量" i, 用于保存一個(gè)計(jì)數(shù)器
初步看,由于創(chuàng)建變量i的函數(shù) newCounter 已經(jīng)返回, 所以每次調(diào)用 func 時(shí), 應(yīng)該是超過(guò)了作用范圍

其實(shí)不然, lua 會(huì)以 closure 的概念來(lái)處理這種情況.
一個(gè) closure 就是一個(gè)函數(shù)加上該函數(shù)所需訪(fǎng)問(wèn)的所有"非局部的變量"

所以上例中 c1, c2 是同個(gè)函數(shù)所創(chuàng)建的兩個(gè)不同的 closure, 它們各自擁有局部變量i的獨(dú)立實(shí)例.

從技術(shù)上來(lái)講, lua中只有 closure, 而不存在"函數(shù)". 因?yàn)?函數(shù)"本身就是一種特殊的 closure.

后記,C++的類(lèi)對(duì)象不也可以達(dá)到類(lèi)似的效果?

相關(guān)文章

  • Lua常用時(shí)間函數(shù)使用實(shí)例

    Lua常用時(shí)間函數(shù)使用實(shí)例

    這篇文章主要介紹了Lua常用時(shí)間函數(shù)使用實(shí)例,本文直接給出使用代碼實(shí)例,并附有詳細(xì)注釋,要用到哪個(gè)復(fù)制即可,需要的朋友可以參考下
    2015-04-04
  • Lua教程(二十一):編寫(xiě)C函數(shù)的技巧

    Lua教程(二十一):編寫(xiě)C函數(shù)的技巧

    這篇文章主要介紹了Lua教程(二十一):編寫(xiě)C函數(shù)的技巧,本文講解了數(shù)組操作、字符串操作、在C函數(shù)中保存狀態(tài)等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • 在Lua程序中使用MySQL的教程

    在Lua程序中使用MySQL的教程

    這篇文章主要介紹了在Lua程序中使用MySQL的教程,是Lua入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • Lua面向?qū)ο笾?lèi)和繼承淺析

    Lua面向?qū)ο笾?lèi)和繼承淺析

    這篇文章主要介紹了Lua面向?qū)ο笾?lèi)和繼承淺析,本文講解了一些Lua面向?qū)ο蟮囊恍┲R(shí),需要的朋友可以參考下
    2014-09-09
  • Lua腳本語(yǔ)言概述

    Lua腳本語(yǔ)言概述

    這篇文章主要介紹了Lua腳本語(yǔ)言概述,本文講解了Lua是什么、Lua語(yǔ)言的特性、Lua的使用范圍、Lua的基本內(nèi)容、Lua虛擬機(jī)等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • Lua中table庫(kù)函數(shù)方法介紹

    Lua中table庫(kù)函數(shù)方法介紹

    這篇文章主要介紹了Lua中table庫(kù)函數(shù)方法介紹,本文講解了concat、insert、maxn、remove、sort、foreachi等方法,需要的朋友可以參考下
    2014-11-11
  • Lua多重繼承代碼實(shí)例

    Lua多重繼承代碼實(shí)例

    這篇文章主要介紹了Lua多重繼承代碼實(shí)例,本文直接給出實(shí)例代碼,需要的朋友可以參考下
    2015-04-04
  • 實(shí)例講解Lua中pair和ipair的區(qū)別

    實(shí)例講解Lua中pair和ipair的區(qū)別

    這篇文章主要介紹了實(shí)例講解Lua中pair和ipair的區(qū)別,本文直接用實(shí)例代碼來(lái)講解pair和ipair的區(qū)別,需要的朋友可以參考下
    2015-04-04
  • Lua判斷字符串前綴是否為指定字符的3種方法

    Lua判斷字符串前綴是否為指定字符的3種方法

    這篇文章主要介紹了Lua判斷字符串前綴是否為指定字符的3種方法,本文還對(duì)三種方法分別做了性能測(cè)試,需要的朋友可以參考下
    2015-04-04
  • Lua中調(diào)用C++函數(shù)示例

    Lua中調(diào)用C++函數(shù)示例

    這篇文章主要介紹了Lua中調(diào)用C++函數(shù)示例,本文給出的C++函數(shù)average()演示了如何接受多個(gè)參數(shù)且返回超過(guò)一個(gè)值,需要的朋友可以參考下
    2015-07-07

最新評(píng)論