iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 9
0
Software Development

30天 Lua重拾筆記系列 第 9

【30天Lua重拾筆記09】基礎1: 類型-函數

本文同步法表於個人網站

函數 宣告

函數可以使用function來做宣告,並以end結束。

function hello()
  print("Hello, World")
end

實際上這是Lua的語法糖,上面相當於:

hello = function()
  print("Hello, World")
end

函數也是第一公民

在Lua,函數是第一公民,是基本型別,可以榜定於變數,也可以作為參數傳遞,或是回傳
值。

function genFun()
  return function()
    print("Hello, World")
  end
end


function callFun(f)
  f()
end


local _f = genFun() -- # get a function
callFun(_f) -- print("Hello, World")

函數、區域變數與閉包

函數同時也是一個區塊,可以保有區域環境變數,這樣的特性可以用來做閉包。

關於閉包,我想會在中級議題: 閉包在更深入討論。
現在你只要知道函數內的區域變數,外部是無法存取的

function hello()
  local name = "World"
  print("Hello, " .. name)
end

hello()  -- # Output => Hello, World
print("Hello, ", name) -- # => Hello, nil

-- out of hello, can't access local variable name of hello function
-- 離開了 hello函式,就無法存取內部的局部變數`name`

------------------------------------------

function genAddFun(k)
    return function (n)
      return k+n
    end
end

add5 = genAddFun(5)
print(add5(5)) -- # => 10

不定長參數

Lua使用...來處理不定長參數。

function hello(...)
  local members = {...}
  print("有多少成員: ", #members)
  for _,m in pairs(members) do
    print("Hello, "..m)
  end
end

hello("Bob", "Lua", "Luna", "Selene")

...只能是函數最後一個參數。在使用時,可以用{...}來榜定一個參數作為命名使用。

語法糖甜不甜

lollipop

當只有一個參數時,函數的使用有許多語法糖。總歸一句,當輸入是一個字面字串或是字面
表格時,不需要加上括號。

字面字串可以參考基礎1: 類型-字串

function show(message)
  print(message)
end

show "Hello"

----------------------

show [[
                      _oo0oo_
                     o8888888o
                     88" . "88
                     (| -_- |)
                     0\  =  /0
                   ___/`---'\___
                 .' \\|     |// '.
                / \\|||  :  |||// \
               / _||||| -:- |||||- \
              |   | \\\  -  /// |   |
              | \_|  ''\---/''  |_/ |
              \  .-\__  '-'  ___/-. /
            ___'. .'  /--.--\  `. .'___
         ."" '<  `.___\_<|>_/___.' >' "".
        | | :  `- \`.;`\ _ /`;.`/ - ` : | |
        \  \ `_.   \_ __\ /__ _/   .-` /  /
    =====`-.____`.___ \_____/___.-`___.-'=====
                      `=---='


    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

              佛祖保佑         永无BUG
  ]]

至於字面表格,會到基礎3: 複合結構 - table才提到,但簡單的示範如下:

function hello(members)
  print("有多少成員: ", #members)
  for _,m in pairs(members) do
    print("Hello, "..m)
  end
end

hello {"Bob", "Lua", "Luna", "Selene"}

是的,這樣的作法也可以當作不定長參數。

立即呼叫函式表達式(IIFE) 與 匿名函式

關於IIFE,可以參考:什麼是IIFE

和多數高階語言一樣,受到函式型語言影響,Lua的函式沒有名稱也可以執行:

(function ()
  print("Hello, World")
end)()

上一篇
【30天Lua重拾筆記08】基礎1: 類型-字串
下一篇
【30天Lua重拾筆記10】基礎1: 類型-布林和nil
系列文
30天 Lua重拾筆記36
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言