似乎有多种方法可以从另一个文件访问一个文件。为什么我会选择一种方法而不是另一种呢?
local a = loadfile('foo.lua')()
local b = require 'foo.lua'
local c = import 'foo.lua'
答案 0 :(得分:14)
Lua标准库中没有import
函数。不适用于5.1,5.2或5.3。也许您正在考虑提供此功能的其他一些代码;你将不得不询问该功能的提供者。
require
不会加载.lua
个文件;它加载模块。 require
的确是{5.1}中的defined by package.loaders
或5.2 / 3中的package.searchers
。特定模块可以实现为.lua
文件,但它也可以是.dll/.so
。或者,如果模块在应用程序内部,则它可能是在编译时表中查找的名称。或者它可以从互联网上下载一些东西。或者任何事情,具体取决于loaders
/ searchers
做什么。
默认loaders
/ searchers
可以加载.lua
个文件,但它们只会根据Lua搜索路径搜索目录。此路径由环境变量初始化,但用户可以覆盖它。
模块命名约定也有一些子模块的概念。你几乎从不在模块名称中加上“.lua”。 require
加载模块,而不是文件;加载的任何文件都是加载模块的副作用。
哦,require
缓存已加载的模块。使用相同的模块名称再次调用它将只返回先前加载的模块。如果要重新加载模块,则必须先将其有效卸载,这需要编辑模块缓存。 package.loaded
存储模块缓存;将条目设置为nil
会将其从缓存中删除,从而强制require
重新加载它。
请注意,这将 not 自动更改已提取模块的任何代码。很多Lua文件会在文件顶部显示local module_name = require "module_name"
。您无法访问此类脚本并更改已经提取的内容。你必须重新执行这样的脚本。
因此,尝试原位更改模块可能会很危险,除非专门编写代码以期望代码。
loadfile
从磁盘加载文件并将其编译为Lua块。它使用C标准库工具来进行文件加载,因此路径的工作符合Lua编译的C库实现。它返回加载的块但不执行它。