好像有多种方式可以从另一个文件中访问一个文件。为什么我会选择另一种方法?loadfile,require和import之间有什么区别
local a = loadfile('foo.lua')()
local b = require 'foo.lua'
local c = import 'foo.lua'
好像有多种方式可以从另一个文件中访问一个文件。为什么我会选择另一种方法?loadfile,require和import之间有什么区别
local a = loadfile('foo.lua')()
local b = require 'foo.lua'
local c = import 'foo.lua'
在Lua标准库中没有import
函数。不适用于5.1,5.2或5.3。也许你正在考虑提供这种功能的其他代码;你必须向该功能的提供者询问它。
require
不加载.lua
文件;它加载模块。究竟是什么require
做的是defined by package.loaders
在5.1或package.searchers
在5.2/3。一个特定的模块可能被实现为.lua
文件,但它也可能是.dll/.so
。或者,如果模块是应用程序内部的,则它可能是在编译时间表中查找的名称。或者它可以从互联网上下载一些东西。或者任何东西,根据什么loaders
/searchers
做。
默认loaders
/searchers
可以加载.lua
文件,但它们只能通过基于Lua搜索路径的目录进行搜索。此路径由环境变量初始化,但用户可以覆盖它。
模块命名约定也有一些子模块的概念。你几乎从不把“.lua”放在模块名称中。 require
加载模块,而不是文件;加载的任何文件都是加载模块的副作用。
哦,和require
缓存加载模块。使用相同的模块名称再次调用它将简单地返回先前加载的模块。如果你想重新加载一个模块......你不能。似乎没有办法强制模块重新加载。
loadfile
从磁盘加载文件并将其编译为Lua块。它使用C标准库工具来进行文件加载,因此路径的工作与Lua编译的C库实现一致。它返回加载的块但不执行它。
我会补充说,只需要加载一个模块一次,然后再调用时再次请求相同的参数,它会返回模块的返回值(例如来自lua文件的返回值)或true。 loadfile改为总是运行该文件。 – Rochet2
另外,'require'运行模块一次。 'loadfile'不运行该文件。 – lhf