Lua 函式 函式

2021-09-23 19:52:13 字數 3483 閱讀 7423

在lua中,函式是一種對語句和表示式進行抽象的主要機制。函式既可以完成某項特定的任務,也可以只做一些計算並返回結果。

lua具有一項非常於總不同的特徵,允許函式返回多個結果:

s, e = string.find("hello lua users", "lua")

print(s, e)            -->7    9

以lua編寫的函式同樣可以返回多個結果,只需在return關鍵字後列出所有返回值即可:

function maximum (a)

local mi = 1            --最大值的索引

local m = a[mi]         --最大值

for i, val in ipairs(a) do

if val > m then

mi = i; m = val

endend

return m, mi    

endprint(maximum()        -->23    3

關於多重返回值還要介紹乙個特殊函式--unpack。它接受乙個陣列作為引數,並從下標1開始返回該陣列的所有元素:

print(unpack)        -->1    2    3

a, b = unpack        -->a=1, b=2, 3被丟棄

lua中的函式還可以接受不同數量的實參:

function add(...)

local s = 0

for i, v in ipairs do

s = s + v

endreturn s

endprint(add(3, 4, 10, 25, 12))            -->54

參數列中的3個點(...)表示該函式可接受不同數量的實參。實際上,還可以通過變長引數來模擬lua中普通的引數傳遞機制,例如:

function foo(a, b, c)

--可以轉換為:

function foo(...)

local a, b, c = ...

end

lua提供了專門用於格式化文字(string.format)和輸出文字(io.write)的函式。很自然地會想到將這兩個函式合二為一:

function fwrite(fmt, ...)

return io.write(string.format(fmt, ...))

end

--呼叫                    引數

fwrite()                 fmt = nil,沒有變長引數

fwrite("a")              fmt = "a",沒有變長引數

fwrite("%d%d", 4, 5)     fmt = "%d%d",變長引數為4和5

在lua中,函式是一種「第一類值」,這表示在lua中函式與其他傳統型別的值具有相同的權利。函式可以儲存到變數中或table中,可以作為實參傳遞給其他函式,還可以作為其他函式的返回值。

在lua中有乙個容易混淆的概念是,函式與所有其他值一樣都是匿名的,即它們都沒有名稱。當討論乙個函式名是(例如print),實際上是在討論乙個持有某函式的變數。

a = 

a.p("hello world")        -->hello world

print = math.sin          --'print'現在引用了正弦函式

a.p(print(1))             -->0.841470

sin = a.p                 --'sin'現在引用了print函式

sin(10, 20)               -->10    20

「詞法域」是指乙個函式可以巢狀在另乙個函式中,內部的函式可以訪問外部函式中的變數。

function newcounter()

local i = 0

return function()        --匿名函式

i = i + 1

return i

endendc1 = newcounter()

print(c1())        -->1

print(c1())        -->2

在這段**中,匿名函式訪問了乙個「非區域性的變數」i,呼叫i 時並沒有超出作用範圍。乙個closure(閉合函式)就是乙個函式加上該函式所需訪問的所有「非區域性的變數」。如果再次呼叫newcounter,那麼它會建立乙個新的區域性變數i,從而也將得到乙個新的closure:

c2 = newcounter()

print(c2())        -->1

print(c1())        -->3

print(c2())        -->2

將函式儲存在table中:

lib =

lib = {}

function lib.foo(x, y) return x+y end

function lib.goo(x, y) return x-y end

將函式儲存在區域性變數中:

local fact

fact  = function(n)

if n == 0 then return 1

else return n*fact(n-1)

endend   

-- local fact = function(n) .......        --用這種方式定義遞迴是錯誤的,因為呼叫fact(n-1)時,區域性的                                            --fact尚未定義完畢

當乙個函式呼叫時另乙個函式的最後乙個動作時,該呼叫稱為「尾呼叫」,「尾呼叫」不會耗費棧空間(「尾呼叫消除」)。

function f(x)

return g(x)

end

return x[i].foo(x[j]+a*b, i+j)

以下呼叫都不符合尾呼叫準則(乙個函式在呼叫完另乙個函式之後,是否就無其他事情需要做了):

return g(x)+1        --必須做一次加法

return x or g(x)     --必須調整為乙個返回值

return (g(x))        --必須調整為乙個返回值

function func(...)

local mytable = 

for k, v in pairs(mytable) do

print(k, v)

endendfunc("123", 12, "ok")        -->1    123

-->2    12

-->3    ok

Lua基礎學習 Lua函式

函式主要用途 1 是作為呼叫語句使用。2 作為賦值語句的表示式使用。語法 區域性 全域性 function fun name 引數列表 函式體endfunction 定義函式關鍵字注意 1 在使用 lua 函式 變數時一定要先定義函式 變數 2 lua 函式不支援引數預設值,可以使用 or 解決。如...

呼叫Lua函式

翻譯自http gamedevgeek.com tutorials calling lua functions 呼叫lua函式 這是lua指令碼語言教程系列之二。在第一篇中,我們學習了在windows和linux下編譯並執行 hello,world 程式。如果你沒有看過,請參考lua入門一文。這篇文...

Lua常用函式

const char lua setlocal lua state l,lua debug ar,int n 設定給定活動記錄中的區域性變數的值。引數ar與n和lua getlocal中的一樣 參見lua getlocal lua setlocal把棧頂的值賦給變數然後返回變數的名字。它會將值從棧頂...