从 `require(file)` 加载值到本地变量
抱歉如果这是一个常见问题,但如果一些 lib.lua 返回本地函数的表,例如
return {readCsv=readCsv, sumList=sumList, printHelp=printHelp}
并且 file2.lua 使用
local lib=require("lib")
导入它,是否有一种程序化的方法自动将 lib
值加载到本地空间中?因此,我不必一遍又一遍地执行
local readCsv,sumList,printHelp=lib.readCsv,lib.sumList,lib.printHelp
我知道在 LUA 中这是标准操作,它通常不会惹恼太多人。但它经常发生,所以我想知道是否有标准的快捷方式。
(注意:为了明确起见,我知道如何将它们加载到 _ENV
中使它们成为 全局变量,但这恰恰不是我想要的。)
原文链接 https://stackoverflow.com/questions/69877701
在 Lua 中,本地变量是静态声明的结构。它们在编译时已知,一般情况下无法在运行时分配。即使是每个函数所持有的本地变量的数量在编译时也已知,即使在创建函数对象之前它们所持有的值尚未知。
因此,没有动态机制可以将表的内容转储到运行时定义的本地变量数量中。
最接近的方法是手动解析 Lua 脚本 _文本_,以找到所有的 require
语句,自己执行这些 require
,并解析表以生成一系列 local
声明,然后将其插入到 Lua 脚本文本的适当位置中。然后,您将编译该脚本并使用它。
但是这是一个巨大的工作,只是为了摆脱 lib.
,不值得这样做。
基于上面的内容,我编写了一个简化导入的函数。现在,我有点同意@NicolBolas的看法,这可能有点“分号癌症”,但是这个函数很短,而且是可选的(只有几行代码,并不影响通常的LUA模块约定)
get“文件名”
会导入文件并按字母顺序拆分结果。类似于Python命令
from file import *
get“file thing1 thing2…”
会导入文件并仅拆分thing1和thing2。类似于Python命令
from file import thing1,thing2
例如,这里是一个返回一些代码的文件:
-- file = cc.lua
function fun1() print(1) end
function fun2() print(2) end
function fun3() print(3) end
function fun4() print(4) end
function fun5() print(5) end
return {fun3=fun3, fun1=fun1, fun2=fun2, funs5=fun5, fun4=fun4}
这里是一个使用示例(全部拆分)。请注意,子模块(cc.lua
)可以以任何顺序返回其内容,而此代码将按字母顺序拆分它们:
-- file = gettest1.lua
local get=require"get"
local fun1,fun2,fun3,fun4,fun5=get"cc"
fun5()
这里是另一个用法,我们可以以任何顺序拆分一些内容:
-- file = gettest2.lua
local get=require"get"
local fun3,fun1=get"cc fun3 fun1"
fun1()
这里是保存get
函数的get.lua
文件的代码
-- file = get.lua
local function get(spec)
local gets, keys,out={},{},{}
for get in string.gmatch(spec, "([^ ]+)") do gets[#gets+1]= get end
local results = require(table.remove(gets,1))
if #gets>0
then keys= gets
else for key,_ in pairs(results) do keys[#keys+1] = key end
table.sort(keys)
end
for _,key in ipairs(keys) do out[#out+1] = results[key] end
return table.unpack(out)
end
return get
改进?建议?评论?
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
因为返回的只是一个常规的表,你可以通过“解包”这个表把它转变成一个值列表:
-- 作为数组和哈希表返回值 return {readCsv, sumList, printHelp, readCsv=readCsv, sumList=sumList, printHelp=printHelp} -- 然后进行如下操作 local readCsv,sumList,printHelp = (table.unpack or unpack)(require "lib")
返回/分配值的顺序显然很重要。
如果有人还想使用“常规”的语法
local lib = require "lib"
,它仍然可以工作。