Lua - 如何动态构造函数的条件/选项?
2021-3-9 0:54:8
收藏:0
阅读:183
评论:2
我有以下 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
非常感谢任何/所有帮助。
点赞
用户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
评论区的留言会收到邮件通知哦~
推荐文章
- 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 代码?

只需使用模型的字符串值来索引表格。这会给您一个函数,您可以使用亮度值来调用它。
local watts = wattsFromDim[v[4]](v[3])请记住,这两种成员访问形式是等价的。
wattsFromDim.LWB010(128) wattsFromDim["LWB010"](128)