Lua 中动态字符串调用/Eval 的其他方法?
我正在使用一个第三方设备,该设备具有 Lua 的一些实现,并使用 BACnet 进行通信。文档非常糟糕,没有提供任何更高级的编程思想的帮助。只有“这是如何设置变量的...”。因此,我正在尝试弄清楚它,并希望你们可以帮忙。
我需要将一长串变量设置为某些值。我有一个名为 'ME' 的用户数据,其中有多个名为 MVXX 的变量(例如 - MV21,MV98,MV56 等)。
(这都是 Bacnet 的背景。)Bacnet 中的变量都有 17 个“优先级”,即每个 Bacnet 变量实际上都是一种具有 17 个值的列表,其中优先级 16 是默认值。因此,通常,如果我想说 ME.MV12=23,那就会将 MV12 的优先级 16 设置为所需值 23。
但是,我需要设置优先级 17。我可以通过说 ME.MV12_PV[17] = 23 来在提供的 Lua 实现中执行此操作。我可以通过索引 PV 来设置所需的任何优先级。 (相关推论-什么是 PV?下划线是什么?我如何访问这些对象?还是它们只是从 Lua 解释为后端的某个函数?)
话虽如此,我需要使该变量名称动态化,以便可以根据其他代码设置任何需要设置的值。我已经尝试了几次。
这告诉我该对象(MV12_PV[17])不存在:
x = 12
ME["MV" .. x .. "_PV[17]"] = 23
但这种设置优先级 16 的方法很好用:
x = 12
ME["MV" .. x] = 23
我试图尝试一些我认为被称为计算或 Eval 的方法。但是,这只是打印出 'function',后面跟着一些随机的 8 位数字:
x = 12
test = assert(loadstring("MV" .. x .. "_PV[17] = 23"))
print(test)
有什么帮助吗?如果我不清楚,还请原谅 - 坦率地说,我远远落后于 8 球,几乎就像在拼命地摸索。
BACnet “Commmandable”对象(例如Binary Output、Analog Output以及可选的Binary Value、Analog Value和其他少数)实际上具有16个优先级(1-16)。您所指的“第17个”可能是“放弃默认值”,当所有16个优先级都设置为NULL或“放弃”时使用的值。
也许您的系统允许您编写称为“放弃默认值”的BACnet属性。
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的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 代码?

下划线可以作为 Lua 标识符(变量和函数名)的一部分。它们只是变量名的一部分(就像字母一样),并不像
[和]一样是特别的 Lua 运算符。在表达式
ME.MV12_PV[17]中,我们有一个名为ME的对象,它有很多字段,ME.MV12_PV是存储在该对象的"MV12_PV"字段中的数组,而ME.MV12_PV[17]是该数组中的第 17 个槽位。如果想要动态地访问字段,需要知道的是,在 Lua 中使用点符号访问字段相当于使用方括号符号,并将字段名作为字符串传递进去:
--以下三种写法都是等价的: x.foo x["foo"] local fieldname = "foo" x[fieldname]所以,在您的情况下,可能希望尝试这样做:
local n = 12 ME["MV"..n.."_PV"][17] = 23