在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 3a, 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 factfact = 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把棧頂的值賦給變數然後返回變數的名字。它會將值從棧頂...