編程小知識之 Lua 函數定義

本文簡單介紹了 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

相關文章
相關標籤/搜索