「Lua」13節-函數function

為什麼要用函數

  • 降低程序的複雜性:將獨立的模塊用函數封裝後,後續使用時只需要關心它能實現的功能,而不需要考慮函數里的細節;
  • 增加程序的可讀性
  • 避免大量重複代碼:將相同代碼部分用函數封裝,能最大限度的減少代碼冗餘;
  • 避免大量局部變量造成的變量汙染:函數中的局部變量,其作用域在函數內部,不會給全局帶來干擾;

函數的定義

在Lua中定義函數使用function關鍵字,語法如下:

function function_name(arg1,arg2) -- arg1與arg2代表參數列表
-- 具體業務邏輯實現 ...
end

上面代碼定義了一個全局函數,名稱為 function_name ,全局函數本質上是函數類型的值賦給了一個全局變量,上面的代碼等價於:

function_name = function(arg1,arg2)
-- 具體業務邏輯實現 ...
end

由於全局變量及全局函數會汙染全局名字空間,同時也有性能損耗,所以我們應儘可能使用“局部函數

”及“局部變量”,其語法定義上差不多,只不過需要在開頭加上 local 修飾符。

local function function_name(arg1,arg2)
-- body
end
local function_name = function(arg1,arg2)
-- body
end

由於函數的定義本質上也是變量賦值,而變量的定義必須放在變量使用之前,所以函數的定義也需要放在函數調用之前。

函數調用

函數調用就很簡單了。

function_name()
function_name(arg1)

利用函數來進行面向對象編程

Lua它是弱類型腳本語言,同時它本質上不能說是“面向對象”的,但我們可以通過Lua的table和function來實現“面向對象”編程。

其原理是:因為函數的定義本質上是函數類型的值賦給了變量,所以我們可以把函數名替換為某個Lua table的某個字段。

local stu={}
function stu.age(age)
print('age:'..age)
end
stu.age(22)

上面代碼等價於

local stu={}
stu.age = function(age)
print('age:'..age)
end
stu.age(22)

函數的參數

有編程基礎的同學都知道函數參數主要有:形參、實參,在此我們不過多介紹這2個概念了。

Lua的函數參數大部分都是按值傳遞的。

當實參與形參個數不同時,Lua會自動調整實參個數,規則如下:

  • 實參個數大於形參個數時,從左向右,多餘的實參會被忽略;
  • 實參個數小於形參個數時,從左向右,沒有被實參初始化的形參會被初始化為 nil 。

Lua還支持

變長參數,若形參定義為 ... ,則表示該函數可以接收不同長度的參數,訪問參數時也要用 ... ,如下:

-- 函數的變長參數
local function stu(...) -- 形參處寫為 ... 代表是可變參數
local infos={...} -- 調用形參時也要寫為 ... ,當把可變參數放入table中後,參數1的索引是1,參數2的索引是2,以此類推
local stuinfos=string.format('name:%s,age:%s',infos[1],infos[2]);
print(stuinfos)
end
stu('susan')
stu('susan',28)

上面的函數參數都是值傳遞方式傳遞的,當然也可以採用引用傳遞方式傳遞。當函數的參數是table類型時,此時參數傳遞是按引用方式傳遞的。

函數返回值

Lua與其它編程語言不同的是,它支持多個返回值,不少內置函數的返回值就有多個。

-- 函數支持多個返回值
local function demo(x,y)
return y,x
end
print(demo(1,2)) -- 打印出:2 1

當函數返回值的個數和接收返回值的變量個數不一致時,Lua會自動調整參數個數。


分享到:


相關文章: