【问题标题】:What's the difference between loadfile, require, and importloadfile、require 和 import 有什么区别
【发布时间】:2018-12-06 02:13:36
【问题描述】:

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

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

【问题讨论】:

    标签: lua


    【解决方案1】:

    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 只加载一次模块,稍后当使用相同的参数再次调用 require 时,它​​会返回模块的返回值(例如来自 lua 文件的返回值)或 true。 loadfile 总是运行文件。
    • 另外,require 运行该模块一次。 loadfile 不运行文件。
    • 添加到options里面有dofile(),和loadfile类似,但也运行chuck(loadfile只编译chucnk,不运行)。我推荐这个页面和下一部分:lua.org/pil/8.html
    猜你喜欢
    • 2012-07-18
    • 2018-12-24
    • 2011-10-31
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 2013-03-06
    • 2021-05-07
    相关资源
    最近更新 更多