1、概念
在Lua中,函數是對語句和表達式進行抽象的主要方法。既可以用來處理一些特殊的工作,也可以用來計算一些值。
Lua 提供了許多的内建函數,你可以很友善的在程式中調用它們,如print()函數可以将傳入的參數列印在控制台上。
Lua 函數主要有兩種用途:
1.完成指定的任務,這種情況下函數作為調用語句使用;
2.計算并傳回值,這種情況下函數作為指派語句的表達式使用。
基本寫法
function 函數名()
end
還有一種特殊寫法
a(變量)=function()
end
==我感覺像lua這種随便的語言,寫起來爽了,維護起來就要瘋了0.0==

2、操作
2.1 無參數無傳回值
--無參數無傳回值
--跟C#不一樣,lua是從上到下執行的,不能在一個函數之前調用函數
function F1()
print("函數被調用")
end
F1()
還有另外一種寫法
--這種寫法可以把它了解為把名字提前寫了(不完全是)
--有點類似于C#中的委托和事件,通過指派的形式去等于一個函數
F2 = function()
print("F2函數被調用")
end
F2()
==注意:跟C#不一樣,lua是從上到下執行的,不能在一個函數之前調用函數(會報錯)==
因為lua是解釋型語言,使用專門的解釋器對源程式逐行解釋成特定平台的機器碼并立即執行。是代碼在執行時才被解釋器一行行動态翻譯和執行,而不是像編譯型語言在執行之前就完成翻譯。
2.2 有參函數
--有參函數
--函數類型不指定,可以傳任意的參數進去
function F1(a)
print(a)
end
F1(1)
F1('666')
F1(true)
F1(nil)
--像下面這兩個操作這放在C#中肯定會報錯
F1()--不會報錯 隻會補空nil 或者丢棄
F1(6,6,6)--不報錯,傳入參數與函數參數不比對,取第一個參數
2.3 有傳回值函數
--有傳回值函數
function F2(a)
return a
end
Temp = F2(666)
print(Temp)
我們再來搞點騷操作
我們return多個參數,但lua隻傳回了讀取的第一個參數,相當于其他參數都被丢棄了
如果我們想要多個傳回值
正确寫法
function F2(a)
return a,"123",true
end
--多傳回值時 在前面申明多個變量來接取即可
--就一一對應了,在聲明變量的時候也可以,比如a=1,b=2 ,直接寫成a,b=1,2
Temp,temp2,temp3 = F2(666)
print(Temp)
print(temp2)
print(temp3)
==總結一下==
就是這個語言太随便了
- 多傳回值時,在前面申明相對應的變量來接取就行
- 如果變量不夠,不報錯,直接接取對應位置的傳回值(後面的都不要了)
- 如果變量多了,不報錯,直接指派nil
2.4 擷取函數類型
F3 = function ()
print('lua真随便')
end
print(type(F3))
2.5 函數的重載(Lua不支援)
--lua不支援函數的重載
--函數名相同,參數類型不同或者參數個數不同叫函數的重載
--lua會預設調用最後聲明的函數
--舉個例子
function F4()
print('hello')
end
function F4(str)
print('Bye')
end
F()
2.6變長函數
--變長參數
--通過for循環把傳進函數的參數都列印出來
function F5( ... )
nums={...}
for i=1,#nums do
print(nums[i])
end
end
F5(1,2,3,4,5,6)
print('--------------------------------------')
F5(6,"hello",true,nil)--不同參數也可以列印
nums的作用
2.6函數嵌套
--函數嵌套
function F6()
return function ()
print('嵌套函數')
end
end
F7 = F6()
F7()
--閉包
--外部傳進來的這個x實際上會産生一個臨時變量,我們把這個X包裹到了function (y) return x+y end這個函數裡面
--相當去在這改變了傳入參數的 生命周期
function F8(x)
return function (y)
return x+y
end
end
F9 = F8(2)--按理說這個F8(2)執行完畢就沒有用了,但我們改變了函數的生命周期,把那個2放到了function (y)這個函數裡面去了
print(F9(1))--F9實際上執行的是 function (y)這個函數