Lua 學習(7)--Lua 函數

來源:互聯網
上載者:User

Lua 函數主要有兩種用途:
1.完成指定的任務,這種情況下函數作為調用語句使用;
2.計算並傳回值,這種情況下函數作為指派陳述式的運算式使用。 函數定義

Lua 程式設計語言函數定義格式如下:

optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)    function_body    return result_params_comma_separatedend
optional_function_scope:
該參數是可選的,指定函數是全域還是局部,未設定該參數預設為全域函數,局部函數需要使用關鍵字 local。 function_name:
指定函數名稱。 argument1, argument2, argument3…, argumentn:
函數參數,多個參數以逗號隔開,函數也可以不帶參數。 function_body:
函數體,函數中需要執行的代碼語句塊。 result_params_comma_separated:
函數傳回值, 可以返回多個值,每個值以逗號隔開。 執行個體

以下執行個體定義了函數 max(),參數為 num1, num2,用於比較兩值的大小,並返回最大值:

--[[ 函數返回兩個值的最大值 --]]function max(num1, num2)   if (num1 > num2) then      result = num1;   else      result = num2;   end   return result; end-- 調用函數print("兩值比較最大值為 ",max(10,4))print("兩值比較最大值為 ",max(5,6))

以上代碼執行結果為:

兩值比較最大值為     10兩值比較最大值為     6

Lua 中我們可以將函數作為參數傳遞給函數,如下執行個體:

myprint = function(param)   print("這是列印函數 -   ##",param,"##")endfunction add(num1,num2,functionPrint)   result = num1 + num2   -- 調用傳遞的函數參數   functionPrint(result)endmyprint(10)-- myprint 函數作為參數傳遞add(2,5,myprint)

以上代碼執行結果為:

這是列印函數 -   ##    10    ##這是列印函數 -   ##    7    ##
多傳回值

Lua函數可以返回多個結果值,比如string.find,其返回匹配串”開始和結束的下標”(如果不存在匹配串返回nil)。

> s, e = string.find("www.runoob.com", "runoob") > print(s, e)5    10

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       end    end    return m, miendprint(maximum({8,10,23,12,5}))

以上代碼執行結果為:

23    3
可變參數

Lua 函數可以接受可變數目的參數,和 C 語言類似,在函數參數列表中使用三點 … 表示函數有可變的參數。

function add(...)  local s = 0    for i, v in ipairs{...} do   --> {...} 表示一個由所有變長參數構成的數組      s = s + v    end    return s  end  print(add(3,4,5,6,7))  --->25

我們可以將可變參數賦值給一個變數。
例如,我們計算幾個數的平均值:

function average(...)   result = 0   local arg={...}    --> arg 為一個表,局部變數   for i,v in ipairs(arg) do      result = result + v   end   print("總共傳入 " .. #arg .. " 個數")   return result/#argendprint("平均值為",average(10,5,3,4,5,6))

以上代碼執行結果為:

總共傳入 6 個數平均值為    5.5

我們也可以通過 select(“#”,…) 來擷取可變參數的數量:

function average(...)   result = 0   local arg={...}   for i,v in ipairs(arg) do      result = result + v   end   print("總共傳入 " .. select("#",...) .. " 個數")   return result/select("#",...)endprint("平均值為",average(10,5,3,4,5,6))

以上代碼執行結果為:

總共傳入 6 個數平均值為    5.5

有時候我們可能需要幾個固定參數加上可變參數,固定參數必須放在變長參數之前:

function fwrite(fmt, ...)  ---> 固定的參數fmt    return io.write(string.format(fmt, ...))     endfwrite("runoob\n")       --->fmt = "runoob", 沒有變長參數。  fwrite("%d%d\n", 1, 2)   --->fmt = "%d%d", 變長參數為 1 和 2

輸出結果為:

runoob12

通常在遍曆變長參數的時候只需要使用 {…},然而變長參數可能會包含一些 nil,那麼就可以用 select 函數來訪問變長參數了:select(‘#’, …) 或者 select(n, …)
select(‘#’, …) 返回可變參數的長度
select(n, …) 用於訪問 n 到 select(‘#’,…) 的參數
調用select時,必須傳入一個固定實參selector(選擇開關)和一系列變長參數。如果selector為數字n,那麼select返回它的第n個可變實參,否則只能為字串”#”,這樣select會返回變長參數的總數。例子代碼:

do      function foo(...)          for i = 1, select('#', ...) do  -->擷取參數總數            local arg = select(i, ...); -->讀取參數            print("arg", arg);          end      end      foo(1, 2, 3, 4);  end

輸出結果為:

arg    1arg    2arg    3arg    4

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.