Lua 里面的函數(shù)必須放在調(diào)用的代碼之前,下面的代碼是一個常見的錯誤:
-- test.lua 文件
local i = 100
i = add_one(i)
function add_one(i)
return i + 1
end
我們將得到如下錯誤:
# luajit test.lua
luajit: test.lua:2: attempt to call global 'add_one' (a nil value)
stack traceback:
test.lua:2: in main chunk
[C]: at 0x0100002150
為什么放在調(diào)用后面就找不到呢?原因是 Lua 里的 function 定義本質(zhì)上是變量賦值,即
function foo() ... end
等價于
foo = function () ... end
因此在函數(shù)定義之前使用函數(shù)相當于在變量賦值之前使用變量,Lua 世界對于沒有賦值的變量,默認都是 nil,所以這里也就產(chǎn)生了一個 nil 的錯誤。
一般地,由于全局變量是每個請求的生命期,因此以此種方式定義的函數(shù)的生命期也是每個請求的。為了避免每個請求創(chuàng)建和銷毀 Lua closure 的開銷,建議將函數(shù)的定義都放置在自己的 Lua module 中,例如:
-- my_module.lua
local _M = {_VERSION = "0.1"}
function _M.foo()
-- your code
print("i'm foo")
end
return _M
然后,再在 content_by_lua_file
指向的 .lua
文件中調(diào)用它:
local my_module = require "my_module"
my_module.foo()
因為 Lua module 只會在第一次請求時加載一次(除非顯式禁用了 lua_code_cache
配置指令),后續(xù)請求便可直接復(fù)用。