lua閉包中的尾調用

網上大部分關於閉包的例子如下:

function test()
        local i=0
        return function()//尾調用
            i = i + 1
            return i
        end
    end
    c1=test()
    c2=test()//c1,c2是建立在同一個函數,同一個局部變量的不同實例上面的兩個不同的閉包
            //閉包中的upvalue各自獨立,調用一次test()就會產生一個新的閉包
    print(c1()) -->1
    print(c1()) -->2//重複調用時每一個調用都會記住上一次調用後的值,就是說i=1了已經
    print(c2())    -->1//閉包不同所以upvalue不同    
    print(c2()) -->2

可以看到尾調用是直接return一個匿名function,我嘗試返回一個非全局函數,發現這樣子也是可以的:

--定義一個全局的newTest函數
function newTest()
	print("call global function newTest")
	return 1
end

function test()
	local i = 0
	local function newTest()
		i = i + 1
		return i
	end
	return newTest
end

這樣也可以:

function test()
	local i = 0
	local newTest = function()
		i = i + 1
		return i
	end
	return newTest
end

lua有一個尾調用機制,正確的尾調用是不消耗任何棧空間,它類似於goto函數。**尾調用的定義就是當一個函數的調用是另一個函數的最後一個動作時。**尾調用也讓迭代器和閉包沒有額外的開銷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章