【发布时间】:2018-12-06 02:13:36
【问题描述】:
似乎有多种方法可以从另一个文件访问一个文件。为什么我会选择一种方法而不是另一种?
local a = loadfile('foo.lua')()
local b = require 'foo.lua'
local c = import 'foo.lua'
【问题讨论】:
标签: lua
似乎有多种方法可以从另一个文件访问一个文件。为什么我会选择一种方法而不是另一种?
local a = loadfile('foo.lua')()
local b = require 'foo.lua'
local c = import 'foo.lua'
【问题讨论】:
标签: lua
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 重新加载它。
请注意,这将不会自动更改已获取模块的任何代码。很多 Lua 文件的顶部都会有类似local module_name = require "module_name" 的东西。您无法访问此类脚本并更改它们已经获取的内容。您将不得不重新执行此类脚本。
因此,尝试就地更改模块可能会很危险,除非代码是专门编写的。
loadfile 从磁盘加载文件并将其编译为 Lua 块。它使用 C 标准库工具来进行文件加载,因此路径与编译 Lua 时使用的 C 库实现一致。它返回加载的块但不执行它。
【讨论】:
require 运行该模块一次。 loadfile 不运行文件。