返回介绍

调用代码前先定义函数

发布于 2019-08-25 05:47:46 字数 1223 浏览 651 评论 0 收藏 0

Lua 里面的函数必须放在调用的代码之前,下面的代码是一个常见的错误:

-- 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

为什么放在调用后面就找不到呢?原因是 Lua 里的 function 定义本质上是变量赋值,即

function foo() ... end

等价于

foo = function () ... end

因此在函数定义之前使用函数相当于在变量赋值之前使用变量,Lua 世界对于没有赋值的变量,默认都是 nil,所以这里也就产生了一个 nil 的错误。

一般地,由于全局变量是每个请求的生命期,因此以此种方式定义的函数的生命期也是每个请求的。为了避免每个请求创建和销毁 Lua closure 的开销,建议将函数的定义都放置在自己的 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 文件中调用它:

local my_module = require "my_module"
my_module.foo()

因为 Lua module 只会在第一次请求时加载一次(除非显式禁用了 lua_code_cache 配置指令),后续请求便可直接复用。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文