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