當(dāng)前位置:
首頁 >
Lua 函数、闭包、尾调用总结
發(fā)布時間:2025/7/14
31
豆豆
生活随笔
收集整理的這篇文章主要介紹了
Lua 函数、闭包、尾调用总结
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
《lua 程序設(shè)計》在線閱讀:http://book.luaer.cn/
1.函數(shù)
函數(shù)有兩種用途:- 完成指定的任務(wù),這種情況下函數(shù)作為調(diào)用語句使用;
- 計算并返回值,這種情況下函數(shù)作為賦值語句的表達(dá)式使用。
1.1 語法
function func_name (arguments-list)statements-list; end;示例 function foo (x) return 2*x end foo = function (x) return 2*x end從上面我們可以看出lua函數(shù)定義實際上是一個賦值語句,將類型為function的變量賦給一個變量,需注意:- 調(diào)用函數(shù)的時候,如果參數(shù)列表為空,必須使用()表明是函數(shù)調(diào)用。
- 當(dāng)函數(shù)只有一個參數(shù)并且這個參數(shù)是字符串或者表構(gòu)造的時候,()可有可無,例如
1.2 返回值
lua函數(shù)可以返回多個值function foo0 () end -- returns no results function foo1 () return 'a' end -- returns 1 result function foo2 () return 'a','b' end -- returns 2 results需注意返回多個值是:
print((foo2())) --> a
1.3 可變參數(shù)
- 可變參數(shù)用...來表示
- Lua將函數(shù)的可變參數(shù)放在一個叫arg的表中,除了參數(shù)以外,arg表中還有一個域n表示參數(shù)的個數(shù)。
2.函數(shù)閉包
當(dāng)一個函數(shù)內(nèi)部嵌套另一個函數(shù)定義時,內(nèi)部的函數(shù)體可以訪問外部的函數(shù)的局部變量,這種特征我們稱作詞法定界。先看如下代碼: function fn()local i = 0return function() -- 注意這里是返回函數(shù)的地址,不是執(zhí)行i = i + 1return iend endc1 = fn() -- 接收函數(shù)返回的地址 print(c1()) --> 1 --c1()才表示執(zhí)行 print(c1()) --> 2如上,調(diào)用c1()時,fn函數(shù)明顯已經(jīng)返回,lua閉包閉包思想正確處理這種情況:
- 我們稱i為從c1的外部局部變量(external local variable)或者upvalue。
- 簡單的說,閉包是一個函數(shù)以及它的upvalues
3.函數(shù)尾調(diào)用
- 尾調(diào)用是一種類似在函數(shù)結(jié)尾的goto調(diào)用。
- 當(dāng)函數(shù)最后一個動作是調(diào)用另外一個函數(shù)時,我們稱這種調(diào)用尾調(diào)用。
例如:
- 尾調(diào)用不需要使用棧空間,因此尾調(diào)用遞歸的層次可以無限制的。
例如下面調(diào)用不論n為何值不會導(dǎo)致棧溢出。
function foo (n)if n > 0 then return foo(n - 1) end end需要注意的是:必須明確什么是尾調(diào)用。一些調(diào)用者函數(shù)調(diào)用其他函數(shù)后也沒有做其他的事情但不屬于尾調(diào)用。比如:
function f (x)g(x)return end上面這個例子中f在調(diào)用g后,不得不丟棄g地返回值,所以不是尾調(diào)用,同樣的下面幾個例子也不時尾調(diào)用:
return g(x) + 1 -- 還需+1 return x or g(x) -- 還需比較 return (g(x)) -- 還需調(diào)整為一個返回值
轉(zhuǎn)載于:https://www.cnblogs.com/fzll/p/3954571.html
總結(jié)
以上是生活随笔為你收集整理的Lua 函数、闭包、尾调用总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于加载django模块时的错误:no
- 下一篇: 2014年中回首与展望