当前位置:  开发笔记 > 编程语言 > 正文

loadfile,require和import之间有什么区别

如何解决《loadfile,require和import之间有什么区别》经验,为你挑选了1个好方法。

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

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

Nicol Bolas.. 16

importLua标准库中没有任何功能.不适用于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库实现.它返回加载的块但不执行它.



1> Nicol Bolas..:

importLua标准库中没有任何功能.不适用于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库实现.它返回加载的块但不执行它.


我想补充一点,只需要加载一个模块一次,之后再次使用相同的参数调用require时,它返回模块的返回值(例如lua文件的返回值)或true.而是loadfile总是运行该文件.
此外,`require`运行模块一次.`loadfile`不运行该文件.
推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有