loadfile、require 和 import 之间有什么区别?

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

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

原文链接 https://stackoverflow.com/questions/34235540

点赞
stackoverflow用户734069
stackoverflow用户734069

Lua 标准库没有 import 函数,5.1、5.2 或 5.3 都没有。也许你会想到其他代码可以提供这个功能;你得问这个函数的提供者。

require 不会加载 .lua 文件,它会加载 _模块_。require 的功能由 5.1 的 package.loaders 或 5.2/3 的 package.searchers 定义。一个特定的模块可以被实现为 .lua 文件,也可以是 .dll/.so 文件,或者是一个在应用程序里查找的编译时表里的名称。或者它可以从互联网上下载任何东西,这取决于 loaders/ searchers 的具体操作。

默认的 loaders/ searchers 可以加载 .lua 文件,但它们只在基于 Lua 搜索路径的目录中搜索。这个路径是通过一个环境变量来初始化的,但是用户可以覆盖它。

模块命名约定也有一些子模块的概念。你几乎不会在模块名中加入 .luarequire 加载模块而不是文件;所有加载的文件都是加载模块的副作用。

哦,require 对已加载的模块进行了缓存。再次使用相同的模块名调用它将简单地返回先前加载的模块。如果你想重新加载一个模块,你必须先有效地卸载它,这需要编辑模块缓存。package.loaded 存储模块缓存;将一个条目设置为 nil 将它从缓存中删除,强制 require 重新加载它。

需要注意的是,这不会自动更改已经获取模块的任何代码。许多 Lua 文件在文件的顶部都有像 local module_name = require "module_name" 这样的内容。你不能干涉这样的脚本并改变它们已经获取的东西。你需要重新执行这样的脚本。

因此,在现场修改模块可能是危险的,除非代码专门编写以接受它。

loadfile 从磁盘加载文件并将其编译为 Lua 块。它使用 C 标准库设施来进行文件加载,所以路径与 Lua 编译的 C 库实现相符。它返回加载的块但没有执行。

2015-12-12 02:37:28