日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(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)造的時候,()可有可無,例如
print "Hello World" <--> print("Hello World")

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需注意返回多個值是:
  • 多返回值的函數(shù)必須是作為表達(dá)式最后一個參數(shù),否則只返回一個值
  • 接收的話不足補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 可變參數(shù)

    • 可變參數(shù)用...來表示
    • Lua將函數(shù)的可變參數(shù)放在一個叫arg的表中,除了參數(shù)以外,arg表中還有一個域n表示參數(shù)的個數(shù)。
    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.函數(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
    如果我們再次調(diào)用fn,將創(chuàng)建一個新的局部變量i:

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

    3.函數(shù)尾調(diào)用

    • 尾調(diào)用是一種類似在函數(shù)結(jié)尾的goto調(diào)用。
    • 當(dāng)函數(shù)最后一個動作是調(diào)用另外一個函數(shù)時,我們稱這種調(diào)用尾調(diào)用。

    例如:

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

    • 尾調(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。