加载代码的本质

lua-users home
wiki

在 Lua 中,有各种方法可以加载外部代码。本文概述了这些方法之间的关系。

loadstring [1] 函数从指定的字符串中实例化一个 Lua 函数,该字符串可以是已编译的 Lua 字节码或 Lua 源代码,loadstring 会将 Lua 源代码编译成 Lua 字节码。还有一些相关的函数。loadfile [2] 函数类似,但它从给定文件系统路径下的文件获取代码。loadstringloadfile 都是更高级别的函数,它们是根据更低级别的 load 函数代码实现的。load [3] 函数从零个或多个子字符串的串联中实例化一个 Lua 函数,这些子字符串是逐段获取的。当代码很大且逐段读取时,loadloadstring 更有效率,例如,当文件以块的形式读取时,因为它不一定将整个源代码字符串存储在内存中,而是只存储字节码。

dofile [4] 执行 loadfile 所做的事情,并执行该函数。

package.loadlib [5] 函数实例化一个 Lua 函数,该函数包装了指定动态加载共享库 [6] 的指定符号名称的本机代码(相对路径以操作系统特定的方式搜索 [6][7][8])。这特别允许在运行时动态加载非 Lua 代码。

package.loaders [9] 是一个搜索器函数 [9] 数组(也许它应该被命名为 package.searchers [15])。这些函数中的每一个都可以用来尝试从包名 [10] 所标识的某个位置实例化一个 Lua 函数,该包名提供给搜索器函数。这些搜索器函数中有一个是根据 loadfile 实现的。另外两个是根据 package.loadlib 实现的。另一个既不使用 loadfile 也不使用 package.loadlib,而是返回预先缓存到内存中的 Lua 函数。你也可以添加自己的搜索器(例如,从 ZIP 文件加载或从网络下载)。

将包名映射到文件系统路径,仅适用于存储在文件系统中的代码块。这通过 `package.path` [11] 和 `package.cpath` [12] 变量定义。这种映射预计将在 LuaFiveTwo 中以 `package.searchpath` 函数的形式公开。一般来说,包名不需要遵循约定形式(例如,它可以是 URL 或 GUID),只要某个搜索器能够理解它即可。

`require` [13] 函数返回存储在 `package.loaded` [14] 表中的值,该表以指定的包名为键。如果该值不存在,它将获取由 `package.loaders` 中的搜索器函数依次调用返回的模块加载器函数,调用加载器函数并将包名作为参数传递给它,将返回值缓存到 `package.loaded` 中,并返回该值。

请注意,模块加载是加载函数的特例。可以使用 `package.loaders` 加载不打算作为 Lua 模块使用的代码。即使对于模块,`require` 函数也不需要使用 `module` 函数。

另请参阅


最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2009 年 5 月 2 日凌晨 2:33 GMT (差异)