通过变量名解释未定义的Lua变量
2014-5-21 15:21:42
收藏:0
阅读:200
评论:2
我有一个名为 foo 的函数,在某些情况下可以获取 nil 值,即 foo (VarA),当 VarA 未定义时。这个未定义的 VarA 应该被解释为 "VarA",但我无法调用 foo("VarA"),因为 VarA 应该作为选项参数(与普通字符串参数不同)。
mt = {__index = function(t, k) return k end}
setmetatable(_G, mt)
这会得到所需的结果,但现在每个其他未定义的变量都会返回其名称。比如 abc -> "abc"。您是否有任何方法仅在这种特定情况下激活元表?我可以在我的 foo 方法中切换元表,但当我在 foo 块中时,传递的参数已经是 nil,为时已晚。
附录:我认为问题不够具体。 Schollii 的答案是将参数作为表传递,但不起作用:
foo({option1 = delete, option2 = push})
这应该具有关键信息(option1 和 option2)以及值的信息(即使 delete 和 push 在全局或局部命名空间中不存在)。Schollii 的方法会给我关键信息,但不是值信息(如 "delete" 和 "push")。我无法预先定义 delete 和 push,因为这些新的“关键字”应该由函数本身稍后定义。将这些新关键字作为字符串传递不是一个选项。
点赞
用户2226988
看起来你正在 Lua 中开发一种领域特定语言。如果这是你的意图并且你取得了成功,那太棒了。否则,最好坚持更典型的 Lua 编程风格。
类似于其他建议:
-- 让调用者决定 varA 的作用域
-- 和字符串的默认值
foo(varA or "varA")
2014-05-21 11:14:51
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的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中获取用户配置主目录的跨平台方法
你所需要的就是测试是否为 nil 并将 VarA 的值设为其名称:
function yourFunc(VarA) VarA = VarA or "VarA" -- 如果 VarA 是 nil,则变为字符串 "VarA" ... 使用 VarA ... end然而,你说 VarA 应该作为可选参数。我猜你是指 VarA 是可选的。好的,但是 Lua 不支持在函数调用中使用命名参数,因此如果你有以下函数:
function yourFunc(arg1, arg2, optArg1, optArg2) ... end那么为了使用
optArg2=something调用 yourFunc,你必须将optArg1设为nil:yourFunc(1, 2, nil, 3)换句话说,你不能这样做
yourFunc(1,2,optArg2=3),这将非常简洁。但是你可以通过使 yourFunc 接受一个表而不是一系列参数来接近这个目标:function setOptionalArgs(tbl, defaults) for i, v in ipairs(defaults) do if tbl[v] == nil then tbl[v] = v end end for k, v in pairs(defaults) do if tbl[k] == nil then tbl[k] = v end end end function yourFunc(args) setOptionalArgs(args, {'arg1', arg2=2, 'arg3'}) -- ... 使用 args.arg1、args.arg2 等等... print(args.arg1, args.arg2, args.arg3) end yourFunc {}现在你可以调用
它将自动设置
arg2="arg2"。请注意,为了简洁,你应该修改setOptionalArgs,以便仅在第二个循环中插入非数组键。