Lua通过变量访问table元素时报type、color参数为nil的问题
问题根因
Lua的table访问有两种语法,你误用了静态点访问语法来读取动态变量对应的键:
- 点语法
t.k:只会查找table中键名**固定为字面量"k"**的字段,不会解析k中存储的变量值 - 方括号语法
t[k]:会先计算括号内表达式/变量的实际值,再用这个值作为键名查找对应字段
你代码中写的Fixture.type.Colors.color、Show.Colors.color全部用了点语法,Lua不会使用你传入的type(实际值为"Beam")、color(实际值为"White")参数去查表,而是硬找Fixture下名为"type"的键、Colors表下名为"color"的键,这两个键在你定义的配置表中根本不存在,自然返回nil触发报错。
另外你代码里Fixture.Beam.loaded_color写死了Beam层级,和传入的type参数逻辑不统一,后续如果传入其他灯具类型参数会出现逻辑错误。
修复方案
将所有需要用变量值作为键名的访问位置,替换为方括号动态访问语法即可,修复后的完整函数代码如下:
function color(fixture_type, color_name) -- 建议将参数名改为更具语义的名称,避免和内置属性、全局变量重名产生歧义,不改名也可正常运行 color_load = gma.user.getvar('COLOR_LOAD') if color_load == 'True' then -- 用方括号动态读取参数对应的表字段 var("LOADED_BEAM_COLOR", Fixture[fixture_type].Colors[color_name]) cmd("Copy Image 84 At " .. Show.loaded_color_empty .. " /o") cmd("Copy " .. Show.Colors[color_name] .. " At " .. Fixture[fixture_type].loaded_color) end end
修复后调用color('Beam', 'White')时,会正确读取Fixture.Beam.Colors.White对应的值"98.101",不会再出现nil报错。
内容的提问来源于stack exchange,提问作者HarryBilney
相关产品推荐
相关产品推荐

