导入一堆 Lua 名称
2014-2-6 11:58:26
收藏:0
阅读:120
评论:2
在我的脚本中,我遵循从另一个模块“导入”函数的方法。因此,我在脚本开头有类似如下的代码:
local some_function = assert(require("utils").some_function)
local another_func = assert(require("utils").another_func)
local yet_another = assert(require("utils").yet_another)
local and_another = assert(require("utils").and_another)
但是这段代码并不太易读。
(assert()是为了防止函数名称拼写错误。)
我知道我可以很容易地编写自己的函数,例如require_names(),并将上面的代码转换为:
local some_function,another_func,yet_another,and_another
= require_names(“utils”,{“some_function”,“another_func”,“yet_another”,“and_another”})
这看起来非常好。尽管如此,它还不是最佳选择:这段代码中存在冗余:函数名称重复两次。
有没有办法使我的“require_names()”不具有冗余问题?
或者,您有解决可读性问题的其他方法吗?
(我需要在Lua 5.1和5.2上运行的解决方案)
点赞
用户312586
我会这样做:
local u = require 'utils'
然后像这样使用它:
u.some_function(...)
这非常容易键入并且非常明显。
如果您真的需要 locals,那么我不会使用一个叫做 require_names 的单个函数,而是两个函数:常规的 require 和 extract。这是 extract
local function extract(t, keys)
local values = {}
for i=1, #keys do values[i] = t[keys[i]] end
return unpack(values)
end
用法:
local utils = require 'utils'
local some_function, another_func, yet_another, and_another =
extract(utils, { "some_function", "another_function", "yet_another", "and_another"})
2014-02-06 16:51:15
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在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中获取用户配置主目录的跨平台方法
如果你只想使用 utils 模块中的一部分,但是只创建本地变量,则不行。其他答案会给你整个 utils 模块,在这种情况下,我不明白为什么不直接使用
require 'yourmodule'。如果你可以放弃本地变量,则:function require_names(modName, objNames) for i,v in ipairs(objNames) do _G[v] = assert(require(modName)[v]) end end可以在 5.1 中使用:
> print(setn) nil > print(insert) nil > require_names("table", {"setn", "insert"}) > print(setn) function: 005F7910 > print(insert) function: 005F7890唯一的非全局选项是将你需要的内容放入一个本地表中,以获取你需要的子集:
function require_names(modName, objNames) local mod = {} for i,v in ipairs(objNames) do mod[v] = assert(require(modName)[v]) end return mod end local utils = require_names("utils", { 'a', 'b' }) utils.a = asdfasf print(utils.b)但与
local utils=require 'utils'相比,以上方法的唯一好处是它记录了你从所需的模块中要使用哪些内容。但是,由于所有的引号和花括号,这样做有点嘈杂。