本文簡單介紹了 Lua 函數定義的一點知識web
在 Lua 中,咱們定義函數的方式和在 C 語言中定義函數的方式很像:svg
local function func_name(func_param) -- func_body end
但實際上,這種定義方式僅是 Lua 提供的語法糖,實際執行時, Lua 會將上面的函數定義轉換爲匿名函數的形式:函數
-- define func_name local func_name -- set func_name func_name = function(func_param) -- func_body end
有時候咱們也會手動定義匿名函數,但寫法上每每會比上面的方式更簡潔一些:spa
local func_name = function(func_param) -- func_body end
這裏要注意的是,上面的這種函數定義方式和以前的兩種函數定義並不等價,差異在於 func_name 對於函數體的可見性上(在上面的這種函數定義方式中, func_name 對於函數體並不可見).net
通常狀況下,這種差別並不會形成很大的問題,可是涉及定義遞歸函數時就要多加註意了.code
下面是用遞歸實現的累計求和函數,有興趣的朋友能夠注意一下三種函數定義方式的表現差別:xml
-- method 1 local function sum(val) if val <= 1 then return val else return val + sum(val - 1) end end
-- method 2, same as method 1 local sum sum = function(val) if val <= 1 then return val else return val + sum(val - 1) end end
-- method 3, will cause global "sum" access problem local sum = function(val) if val <= 1 then return val else return val + sum(val - 1) end end
總結
在 Lua 中, 謹慎定義遞歸匿名函數遞歸
本文同步分享在 博客「tkokof1」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。ip