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