Lua的Iterator以及函式心得

2021-08-30 04:08:13 字數 2949 閱讀 1363

local tbl =

local count = #tbl

local inc = 0

function iter(tableinput)

return function()

if inc > count then

return

end

inc = inc + 1

return tableinput[inc], inc

end

end

for elem, index in iter(tbl) do

print(elem)

if index > 2 then

inc = 0

end

end如果執行一下的話,不出意外一定會死迴圈。如果把函式iter改一下就是我們常見的generic for了。

function iter(tableinput)

local count2 = #tbl

local inc2 = 0

return function()

if inc2 > count2 then

return

end

inc2 = inc2 + 1

return tableinput[inc2], inc2

end

end跟蹤一下執行也可以發現,count2以及inc2這兩行在iter被for呼叫的時候,只會第一次執行而且只執行一次。接下來的呼叫中只會從return function這裡開始。如果返回nil,那麼for就停止迴圈。

我比較好奇的是,對於iter在for迴圈的時候,很顯然是保持了乙個內部的堆疊不變,也就是說inc2和count2類似於c語言的static內部變數。但是學的還是一知半解,不知道如何dump出此時的堆疊狀態。

關於函式對於區域性變數,好像是會在棧上做乙個快取,看下面**

stringb = "bbbbbbbbbbbbbbb"

do local internala = "print for first time"

function printstra()

print(internala)

end

function printstrb()

print(stringb)

end

enddo

local internala = "!!!!!!!!!!!!!!!!!!!!"

stringb = "cccccccccccccccc"

printstra()

printstrb()

endinternala = "!!!!2222222222222"

printstra()

stringb = "ddddddddddddddddddd"

printstrb()

當我們執行這段**,可以發現

print for first time

cccccccccccccccc

print for first time

ddddddddddddddddddd

也就是對於printstra,每次呼叫的結果都是一樣的,而printstrb的結果會根據全域性變數stringb的不同而不同。這一點值得以後的研究。

關於閉包(closures),pil上有乙個很有意思的例子,我做了一些擴充套件。

local x = function ()

local i = 0

print "aaa"

local function x2()

i = i + 1

print "bbb"

return i

end

return x2 — 這個地方不能是return x2(),否則返回的就是值而不是函式

endx()

print "*****=="

x()

print "*****=="

local c = x()

print "*****=="

print(c())

print "*****=="

print(c())

print "*****=="

print(c())

print "*****=="

local c = x()

print "*****=="

print(c())

結果會是什麼呢?

首先,很有意思的一點是,對於返回正確函式尾呼叫,一種情況下,return function()後面的**不會執行,就是說當x()時,以及當local c=x()的時候。

我們如果想達到計數器的效果,一定要用local c=x(),然後反覆呼叫c(),而不是呼叫x()。原因就是c實際上指向了x返回的匿名函式,這樣每次執行c,實際上執行的就是那個匿名函式。另外乙個有趣的結論是,對於返回正確尾呼叫的函式,尾呼叫實際上還沒有執行。

執行的結果就是下面這樣,你猜對了麼?

aaa

*****==

aaa

*****==

aaa

*****==

bbb

1 *****==

bbb

2 *****==

bbb

3 *****==

aaa

*****==

bbb

1關於尾呼叫, return g(x)是尾呼叫,而return (g(x))就不是,原因是return (fun()) — this expression is a single function call surrounded in parentheses, which is different than the required single function call (the parentheses adjust fun to one return value).

Lua的使用入門之在C 程式中呼叫lua函式1

學習lua將近半個月了,以前也了解過,只是沒有實際運用的環境。現在將自己這半個月來的心得寫下來。首先,要想在c 程式中作用lua指令碼,必須包含相應的lua標頭檔案,extern c 因為lua是基於c的,所以要使變數和 函式按照c語言方式編譯和連線 在你的編譯環境中要包含lua的標頭檔案,我的是l...

Python中sort以及sorted函式初探

help on built in function sorted in module builtin sorted sorted iterable,cmp none,key none,reverse false new sorted list help on built in function so...

Lua中「 」以及 物件導向

閱讀本文需要理解前一篇文章lua中的元方法 當通過 呼叫時,系統會自動傳遞當前的table給self,例如a.eat a 相當於a eat 傳遞當前物件給eat方法,這樣就提高了table的方法的擴充套件性了。本質是使用table進行模擬 定義空表,相當於是乙個類 person 定義區域性表引用變數...