loadfile,require和import之间有什么区别

时间:2015-12-12 02:23:57

标签: lua

似乎有多种方法可以从另一个文件访问一个文件。为什么我会选择一种方法而不是另一种呢?

local a = loadfile('foo.lua')()
local b = require 'foo.lua'
local c = import 'foo.lua'

1 个答案:

答案 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库实现。它返回加载的块但不执行它。