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 球,几乎就像在拼命地摸索。

点赞
用户90511
用户90511

下划线可以作为 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
2018-03-18 21:39:02
用户1938795
用户1938795

BACnet “Commmandable”对象(例如Binary Output、Analog Output以及可选的Binary Value、Analog Value和其他少数)实际上具有16个优先级(1-16)。您所指的“第17个”可能是“放弃默认值”,当所有16个优先级都设置为NULL或“放弃”时使用的值。

也许您的系统允许您编写称为“放弃默认值”的BACnet属性。

2018-03-19 18:52:06