日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Lua 函数、闭包、尾调用总结

發布時間:2025/7/14 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的變量賦給一個變量,需注意:

  • 調用函數的時候,如果參數列表為空,必須使用()表明是函數調用。
  • 當函數只有一個參數并且這個參數是字符串或者表構造的時候,()可有可無,例如
print "Hello World" <--> print("Hello World")

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需注意返回多個值是:
  • 多返回值的函數必須是作為表達式最后一個參數,否則只返回一個值
  • 接收的話不足補nil,超出舍去,如
  • x,y = foo2() -- x='a', y='b' x,y = foo1(); -- x = 'a', y= nil x = foo2() -- x='a', 'b'舍去 x,y = foo2(), 20 -- x='a', y=20另外,括號可以強制返回一個值
    print((foo2())) --> a

    1.3 可變參數

    • 可變參數用...來表示
    • Lua將函數的可變參數放在一個叫arg的表中,除了參數以外,arg表中還有一個域n表示參數的個數。
    function fn(name,nick,...)print(name,nick) -- 一撮毛 大帥鍋for i,v in ipairs(arg) doprint(arg[i]) -- 1,2,3,4end end fn("毛毛","大帥鍋",1,2,3,4); -- name="毛毛",nick="大帥鍋",arg={1,2,3,4; n = 4}

    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
    如果我們再次調用fn,將創建一個新的局部變量i:

    c2 = fn() print(c2()) --> 1 print(c1()) --> 3 print(c2()) --> 2

    3.函數尾調用

    • 尾調用是一種類似在函數結尾的goto調用。
    • 當函數最后一個動作是調用另外一個函數時,我們稱這種調用尾調用。

    例如:

    function f(x)return g(x) -- 類似于goto g(x)函數的地址 end

    • 尾調用不需要使用棧空間,因此尾調用遞歸的層次可以無限制的。

    例如下面調用不論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 函数、闭包、尾调用总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。