1. 程式人生 > >Lua函式的幾種用法詳解

Lua函式的幾種用法詳解

一、lua函式

在面嚮物件語言中函式是一組一起執行任務的語句。可以把程式碼放到獨立的函式中。怎麼劃分程式碼功能之間的不同,但在邏輯上劃分通常是讓每個函式執行特定的任務。在Lua中,函式是作為"第一類值"來使用的,在lua中函式可以儲存在變數中,可以通過引數傳遞給其他函式,或者作為函式的返回值(類比C/C++中的函式指標),這種特性使Lua具有極大的靈活性。Lua對函數語言程式設計提供了良好的支援,可以支援巢狀函式。另外,Lua既可以呼叫Lua編寫的函式,還可以呼叫C語言編寫的函式(Lua所有的標準庫都是C語言寫的)。Lua語言提供了程式可以呼叫大量的內建方法。這邊有一個對lua常用庫函式的總結連線:

Lua函式常用定義方式:

optional_function_scope functionfunction_name( argument1, argument2, argument3..., argumentn)
function_body
return result_params_comma_separated
end

Lua函式引數:

如果一個函式使用引數,它必須宣告接受的引數值變數。這些變數被函式的形式引數呼叫。正式的引數表現得就像在函式內部其他本地變數和在進入函式建立並在退出時銷燬。

Lua函式呼叫:

當建立一個Lua函式,給什麼樣的功能,必須做一個定義。要使用一個方法,將不得不呼叫該函式來執行定義的任務。

當程式呼叫一個函式,程式的控制轉移到被呼叫的函式。被呼叫函式進行定義的任務和在執行它的return語句或當其功能的終端到達時,程式控制返回到主程式。

而呼叫只是需要傳遞所需的引數以及方法名的方法,如果方法返回一個值,那麼你可以儲存返回的值。

例子:

function max(num1, num2)
 
   if(num1 > num2) then
     result = num1;
  else
     result = num2;
  end
 
  return result;
end
 
-- calling a function
print("Max: ",max(10,2))
print("Max: ",max(5,6))
Max:         10
Min:         6

Lua分配和傳遞函式:

在Lua中,我們可以指定函式的變數,也可以將它們作為另一個函式的引數。使用函式作為引數:

myprint = function(param)
  print("Print function:",param,"*")
end
 
function add(num1,num2,funPrint)
  result = num1 + num2
  funPrint(result)
end
myprint(12)
add(3,6,myprint)
輸出結果:
Print function:12 *
Print function:9 *

Lua函式使用變參:

可以在Lua中建立一個具有可變引數的函式,作為它的引數。我們可以通過看一個例子,利用可變引數該函式將返回平均值。

function average(...)
  result = 0
  local arg={...}
  for i,v in ipairs(arg) do
     result = result + v
  end
  return result/#arg
end
 
print("The average is:",average(12,6,3,4,5,6))
輸出結果:
The average is:6

Lua函式其它使用舉例:

程式碼如下:
function hello()
print('hello')
end
hello函式不接收引數,呼叫:hello(),雖然hello不接收引數,但是還可以可以傳入引數:hello(32)

另外如果只傳遞一個引數可以簡化成functionname arg的呼叫形式(注意數值不行)

程式碼如下:

hello '3'
hello
hello {}
hello
hello 3
stdin:1: syntax error near '3'

另外對變數名也不適用

程式碼如下:

a = 21
print a
stdin:1: syntax error near 'a'

另外,Lua函式不支援引數預設值,可以使用or非常方便的解決(類似Javascript)

程式碼如下:

function f(n)
n = n or 0
print(n)
end
f()
0
f(1)
1

Lua支援返回多個值,形式上非常類似Python:

程式碼如下:

function f()
return 1,2,3
end
a,b,c = f()
print(a .. b .. c)
123

函式呼叫的返回值可以用於table:

複製程式碼程式碼如下:

t = {f()}
print(t[1], t[2], t[3])
1       2       3

可見,f()返回的三個值分別稱為table的3個元素,但是情況並不總是如此:

複製程式碼程式碼如下:

t = {f(), 4}
print(t[1], t[2], t[3])
1       4       nil

這次,f()返回的1,2,3只有1稱為table的元素;

程式碼如下:

t = {f(), f()}
print(t[1], t[2], t[3], t[4], t[5])
1       1       2       3       nil

總之:只有最後一項會完整的使用所有返回值(假如是函式呼叫)。

對於無返回值的函式,可以使用(f())的形式強行返回一個值(nil)

程式碼如下:

function g()
end
print(g())
print((g()))
nil

實際上,(f())形式的呼叫返回一個且只返回一個值

程式碼如下:

print((f()))
1
print(f())
1       2       3