Lua - 如何动态构造函数的条件/选项?

我有以下 Lua 函数,我希望可以动态构造它,但似乎无法使其工作。

正常调用该函数的方式为 **wattsFromDim.LWB010(128)**。

但是,我想能够动态填充模型“LWB010”和“亮度级别”值 wattsFromDim.MODELID(Brightness-level) 以从数组/表中获取所需的值。

-- 假数据
local wattsFromDim = {
  LWB010 = function (dim) return 0.43981651 * math.exp(0.012712893 * dim) end.
  LWA004 = function (dim) return 0.45677776 * math.exp(0.012712893 * dim) end,
  LWW001 = function (dim) return 0.48765897 * math.exp(0.012712893 * dim) end,
  LWB006 = function (dim) return 0.40134543 * math.exp(0.012712893 * dim) end,
  LCT007 = function (dim) return 0.41987568 * math.exp(0.012712893 * dim) end
}

for k,v in pairs(huelights) do
-- FYI - json - v[1]=deviceID, v[2]=status, v[3]=brightness, v[4]=modelNo
    if v[2] == true then
        -- local watts = wattsFromDim.LWB010(128)
        local watts = wattsFromDim. v[4] ( v[3] ) *-- runtime errors*
        print(v[4], v[2], v[3], watts)
    end
end

非常感谢任何/所有帮助。

点赞
用户2505965
用户2505965

只需使用模型的字符串值来索引表格。这会给您一个函数,您可以使用亮度值来调用它。

local watts = wattsFromDim[v[4]](v[3])

请记住,这两种成员访问形式是等价的。

wattsFromDim.LWB010(128)
wattsFromDim["LWB010"](128)
2021-03-09 00:47:45
用户11740758
用户11740758

一个带有元方法 __call 的修正版本示例

lua -i 中展示(控制台)

-- 我有一个用于纯文本字符串的Lua代码的表
code
table: 0x5668ecf0
print(code.cmd) -- 添加更多 code.codestrings 的函数
-- cmd()
return function(cmd)
local cmd=io.popen(cmd, 'r')
cmd=cmd:read('a+')
return cmd
end
-- code.cmd已经被加载,现在让我们把wfd.lua加载到code.wattsFromDim中
code.wattsFromDim=cmd('cat wfd.lua')
-- 通过简单地打印代码来检查它
print(code.wattsFromDim)
local wattsFromDim = {
  LWB010 = function (dim) return 0.43981651 * math.exp(0.012712893 * dim) end,
  LWA004 = function (dim) return 0.45677776 * math.exp(0.012712893 * dim) end,
  LWW001 = function (dim) return 0.48765897 * math.exp(0.012712893 * dim) end,
  LWB006 = function (dim) return 0.40134543 * math.exp(0.012712893 * dim) end,
  LCT007 = function (dim) return 0.41987568 * math.exp(0.012712893 * dim) end
}

setmetatable(wattsFromDim,{__call=function(...)
self,huelights=...
assert(huelights)
for k,v in pairs(huelights) do
-- FYI - json - v[1]=deviceID, v[2]=status, v[3]=brightness, v[4]=modelNo
    if v[2]==true then
        -- local watts=wattsFromDim.LWB010(128)
        local watts=self[v[4]](v[3])
        print(v[4],v[2],v[3],watts)
    end
end
end})
return wattsFromDim
-- EOF

-- 现在将代码加载到wattsFromDim中
wattsFromDim=load(code.wattsFromDim)()
-- 完成,创建一个样例数据表
huelights={{1,true,1,'LCT007'},{0,false,0,'LWW001'},{3,true,0,'LWA004'}}
-- 发射!!!
wattsFromDim(huelights) -- 记住这是一个带有 __call 元方法的表
LCT007    true    1    0.42524758849267
LWA004    true    0    0.45677776
-- __call 元方法:任务完成 ;-)
2021-03-09 16:59:07